Bir polimorfik nesne üzerinde typeid
kullanırken, typeid
işleminin çalışma zamanı çalışma zamanında nesnenin bilgilerini alması gerektiğinden, nesnenin tanımlanması gerektiğini (yalnızca bir bildirim değil) düşünüyorum. İşte benim kod:Bir polimorfik nesnede typeid kullanıldığında, tanımlanmalı mı?
#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;
}
Ve clang 3.4, ben bağlantı hata var: g++ 4.8.1 ile, iyi çalışıyor
undefined reference to `d'
Ama ben sonuç var:
1D
8
Benim sorum :
- Hangisi doğrudur?
- g ++
typeid
'u nasıl uygular? Tanım olmadan bir polimorfik nesneden bilgiyi nasıl alabilir? clang 3.4 haklı gibi
Hangisinin doğru olduğunu bilmiyorum, ancak [g ++ bağlayıcı bağlayıcısı hatası aldı] (http://coliru.stacked-crooked.com/a/288ddd8f4e70f535) extern D & d ile. Bu yüzden belki g ++ 'd' nin (D işaretçisi veya referansı değil) tip olması gerektiğini anlamaya yetecek kadar akıllıdır. –
@BryanChen Ama standart tarafından izin verilmez ...? – songyuanyao
Bence g ++ 'nun iyi çalışmasının sebebi de' d 'türünün olması. * Statik * 'D', bu yüzden derleyici' d' türünü bilir ve belki de g ++ çalışma zamanında '' '' typeinfo' türünü almak için en iyi duruma getirilmiş koddur. Ancak, 'd' türünün' D'' veya 'D *' olması durumunda, derleyici derleme zamanında ** türünü bilmez, bu nedenle kodu en iyi duruma getiremez. – ikh