Quando si utilizza typeid
su un oggetto polimorfico, penso che l'oggetto deve essere definito (non solo una dichiarazione) perché l'operazione typeid
deve ottenere le informazioni dell'oggetto nel runtime . Qui è il mio codice:Quando si usa typeid su un oggetto polimorfico, deve essere definito?
#include <iostream>
#include <typeinfo>
class D {
virtual ~D() {}
};
extern D d;
int main()
{
std::cout << typeid(d).name() << std::endl;
std::cout << sizeof(d) << std::endl;
}
E con clang 3.4, ho ottenuto l'errore link:
undefined reference to `d'
Ma con g++ 4.8.1, funziona bene ed ho ottenuto il risultato:
1D
8
La mia domanda :
- Quale è giusto?
- Come implementa g ++
typeid
? Come può ottenere le informazioni da un oggetto polimorfico senza definizione?
Non so quale sia corretto, ma [g ++ ha errore linker] (http://coliru.stacked-crooked.com/a/288ddd8f4e70f535) con 'extern D & d'. Quindi forse g ++ è abbastanza intelligente da capire che 'd' deve essere un tipo di' D' (dato che non è un puntatore né un riferimento) –
@BryanChen Ma forse non consentito dallo standard ...? – songyuanyao
Penso che il motivo per cui g ++ sembra funzionare bene è il tipo di 'd'. È * staticamente * 'D', quindi il compilatore conosce il tipo di' d', e forse g ++ ha ottimizzato il codice per ottenere 'typeinfo' di' d' in runtime. Tuttavia, se il tipo di 'd' è' D & 'o' D * ', il compilatore non conosce il suo tipo ** in fase di compilazione **, quindi non può ottimizzare il codice. – ikh