Bei der Verwendung von typeid
für ein polymorphes Objekt, denke ich, das Objekt muss definiert werden (nicht nur eine Deklaration), weil typeid
Betrieb die Informationen des Objekts bei Laufzeit erhalten muss. Hier ist mein Code:Wenn typid für ein polymorphes Objekt verwendet wird, muss es definiert werden?
#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;
}
Und mit clang 3.4, bekam ich den Link Fehler:
undefined reference to `d'
Aber mit g++ 4.8.1, es funktioniert gut und ich erhielt das Ergebnis:
1D
8
Meine Frage :
- Welcher ist richtig?
- Wie implementiert g ++
typeid
? Wie kann es die Information von einem polymorphen Objekt ohne Definition erhalten?
Ich weiß nicht, welcher ist richtig, aber [g ++ Linker Fehler] (http://coliru.stacked-crooked.com/a/288ddd8f4e70f535) mit 'extern D & d'. Also vielleicht ist g ++ schlau genug, um herauszufinden, dass "d" Typ von "D" sein muss (vorausgesetzt es ist kein Zeiger oder Verweis) –
@BryanChen Aber vielleicht nicht erlaubt durch den Standard ...? – songyuanyao
Ich denke, der Grund, warum g ++ gut zu funktionieren scheint, ist der Typ von 'd'. Es ist * statisch * 'D', also weiß der Compiler den Typ von' d', und vielleicht hat g ++ den Code optimiert, um 'typeinfo' von' d' in Runtime zu bekommen. Wenn der Typ von "d" jedoch "D &" oder "D *" ist, kennt der Compiler seinen Typ ** in der Kompilierungszeit ** nicht, sodass der Code nicht optimiert werden kann. – ikh