Po użyciu obiektu typeid
na obiekcie polimorficznym, myślę, że obiekt musi być zdefiniowany (a nie tylko deklaracja), ponieważ operacja musi uzyskać informacje o obiekcie pod adresem runtime. Oto mój kod:W przypadku użycia parametru typid na obiekcie polimorficznym należy go zdefiniować?
#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;
}
I z clang 3.4, mam błąd link:
undefined reference to `d'
Ale z g++ 4.8.1, to działa dobrze i mam wynik:
1D
8
Moje pytanie :
- Który jest poprawny?
- W jaki sposób g ++ implementuje
typeid
? Jak uzyskać informacje z obiektu polimorficznego bez definicji?
Nie wiem, który z nich jest poprawny, ale [g ++ ma błąd linkera] (http://coliru.stacked-crooked.com/a/288ddd8f4e70f535) z 'extern D & d'. Więc być może g ++ jest na tyle sprytny, aby zorientować się, że 'd' musi być typu' D' (biorąc pod uwagę, że nie jest wskaźnikiem ani referencją) –
@BryanChen Ale może nie jest dozwolone przez standard ...? – songyuanyao
Myślę, że powodem, dla którego g ++ wydaje się działać dobrze, jest typ 'd'. Jest * statycznie * 'D', więc kompilator zna typ' d', i być może g ++ zoptymalizował kod, aby uzyskać 'typeinfo' of' d' w środowisku wykonawczym. Jednakże, jeśli typ 'd' jest' D & 'lub' D * ', kompilator nie zna swojego ** typu w czasie kompilacji **, więc nie może zoptymalizować kodu. – ikh