2016-04-25 51 views
0

我有下面的代碼:的dynamic_cast衍生模板較少CV-合格的指針

struct Base 
{ 
    virtual ~Base(){}; 
}; 

template<class T> 
struct Derived : public Base 
{}; 

int main() 
{ 
    Derived<int> d; 
    Base *pD = &d; 

    if(dynamic_cast<Derived<const int>*>(pD)) 
    { 
     std::cout << "const" << std::endl; 
    } 

    if(dynamic_cast<Derived<int>*>(pD)) 
    { 
     std::cout << "non-const" << std::endl; 
    } 
} 

我希望雙方dynamic_casts返回一個有效的指針,因爲新類型較少CV-合格。任何人都可以向我解釋我錯過了什麼嗎?給定Base指針,有什麼辦法可以識別Derived<XYZ>忽略cv限定符嗎?

回答

3

從編譯器的角度來看,Derived<int>Derived<const int>const char*struct MyBox相差甚遠。換句話說,他們之間沒有任何關係。

3

您很困惑編譯器正在查看哪種類型。正在減去const指的是不是模板參數的類型。如果你有

if(dynamic_cast<const Derived<int>*>(pD)) 
{ 
    std::cout << "const" << std::endl; 
} 

if(dynamic_cast<Derived<int>*>(pD)) 
{ 
    std::cout << "non-const" << std::endl; 
} 

然後這兩個輸出將打印。

一個something<sometype>是一個完全不同的類型,然後一個something<some_other_type>const something<sometype>只是const版本的something<sometype>

+0

我不太看怎麼'東西'是'什麼<常量some​​type。這時候>'如此不同?我的印象是,const在編譯過程中被強制執行,並且基本上都是在執行之後。爲什麼動態轉換的運行時檢查仍然區分2? – Araex