2013-05-06 16 views
8

ho usato typeid per ottenere i nomi dei tipi di std :: vector :: size_type e una classe di dimensioni pari a zero A con il seguente codice (cppreference):uscita Strano di std :: :: typeid nome()

#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; 

}; 

e ho avuto questo come output:

m 
1A 

Credo che "1" prima "a" è il risultato del vuoto ottimizzazione classe base, ma che cosa significa "m" è l'acronimo ed è normale?

Sto usando la seguente versione di gcc: g ++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

+9

I nomi restituiti da 'type_info :: name' sono definiti dall'implementazione. Gcc ha scelto 'm' per' size_type'. Mi batte :) – jrok

+0

@jrok ah, potente allora. :) – tmaric

+1

Si potrebbe voler controllare un riferimento sulla funzione ['std :: type_info :: name'] (http://en.cppreference.com/w/cpp/types/type_info/name). –

risposta

11

G ++ utilizza implementazione definita di denominazione per i tipi, ma offre anche l'utilità c++filt per renderli leggibile dall'uomo:

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

Sì! Bello! Grazie! :) – tmaric

+0

Quindi, il nome "m" viene quindi prenotato e corretto per il vettore :: size_type (per g ++)? – tmaric

+0

@ tomislav-maric il nome "m" sta per 'unsigned long', che capita di essere typedef per' std :: size_t', che sembra essere il typedef per 'std :: vector <> :: size_type'. I typedef non creano nuovi tipi. – Cubbi

Problemi correlati