在一個多態對象上使用typeid
時,我認爲該對象必須被定義(不僅僅是一個聲明),因爲typeid
操作需要獲取對象的信息在運行時。這裏是我的代碼:在多態對象上使用typeid時,是否必須定義它?
#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;
}
而且隨着clang 3.4,我得到了鏈接錯誤:
undefined reference to `d'
但隨着g++ 4.8.1,它工作得很好,我得到的結果是:
1D
8
我的問題:
- 哪一個是對的?
- g ++如何實現
typeid
?它如何從沒有定義的多態對象中獲取信息?
我不知道哪一個是正確的,但是[g ++得到鏈接器錯誤](http://coliru.stacked-crooked.com/a/288ddd8f4e70f535)與'extern D&d'。所以也許g ++足夠聰明,可以發現'd'必須是'D'類型(因爲它不是指針或參考) –
@BryanChen但是標準中可能不允許? – songyuanyao
我認爲g ++似乎很好的原因是'd'的類型。它*是靜態*'D',因此編譯器知道'd'的類型,並且可能g ++優化了代碼以在運行時獲得'd'的'typeinfo'。但是,如果'd'的類型是'D&'或'D *',編譯器在編譯時**不知道它的類型**,所以它不能優化代碼。 – ikh