2013-05-06 12 views
8

I typeid verwendet, um die Typnamen des std :: vector :: size_type und eine Null-Size-Klasse A mit dem folgenden Code (cppreference) zu erhalten:merkwürdige Ausgabe von std :: typeid :: name()

#include<iostream> 
#include <vector> 
#include <typeinfo> 

using namespace std; 

class A {}; 

int main() 
{ 
    vector<int> v(10); 

    vector<int>::size_type s = v.size(); 

    A a; 

    cout << typeid(s).name() << endl; 
    cout << typeid(a).name() << endl; 

}; 

und ich habe dies als Ausgabe:

m 
1A 

ich denke, dass „1“ vor dem „A“ ist ein Ergebnis der leeren Basisklasse-Optimierung, aber was bedeutet „m“ steht und ist das normal?

ich folgende gcc Version bin mit: g ++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

+9

Die von 'type_info :: name' zurückgegebenen Namen sind Implementierungen definiert. Gcc wählte 'm' für' size_type'. Beats me :) – jrok

+0

@jrok ah, dann gut. :) – tmaric

+1

Sie könnten einen Verweis auf die Funktion ['std :: type_info :: name'] (http://en.cppreference.com/w/cpp/types/type_info/name) überprüfen. –

Antwort

11

G ++ verwendet die Implementierung definiert für die Arten zu nennen, aber es bietet auch das Dienstprogramm c++filt, um sie menschenlesbar:

$ ./test | c++filt -t 
unsigned long 
A 
+0

Ja! Nett! Vielen Dank! :) – tmaric

+0

Also ist der Name "m" dann reserviert und für Vektor :: size_type (für g ++) festgelegt? – tmaric

+0

@ tomislav-maric der Name "m" steht für 'unsigned long', was typedef für' std :: size_t' ist, was zufällig der typedef für 'std :: vector <> :: size_type' ist. Typedefs erstellt keine neuen Typen. – Cubbi