2011-04-25 18 views
2

在下面的代碼中,我試圖找出爲什麼編譯器(msdev C++ 2010和Comeau)不​​認爲非專用模板get函數的返回類型是const。我希望CASE#2(請參閱code snipet)不能編譯,但它確實如此。任何想法或鏈接?C++鑑定轉換 - 常量和模板

謝謝,單組

template < typename T > 
struct constness 
{ 
    T value; 
    constness() : value(0) {} 
    const T &get() { return value; } 
}; 

template < typename T > 
struct constness< T * > 
{ 
    T * const value; 
    constness() : value(0) {} 
    const T * const &get() { return value; } 
}; 

int main(int argc, const char* argv[]) 
{ 
    // Uses specialized 
    constness< double * > wConstness; 
    const_cast< double * & >(wConstness.value) = new double(1); 
    *wConstness.get() = 12.0; // CASE #1 doesn't compile 

    // Uses non specialized 
    constness< double * const > wConstness2; 
    const_cast< double * & >(wConstness2.value) = new double(1); 
    *wConstness2.get() = 12.0; // CASE #2 compiles, allowing modification of 
          // value pointed by wConstness2.value 

    return 0; 
}; 
+0

'const_cast < double * >(wConstness2.value)= new double(1);'是錯誤的:目標類型的轉換需要是'double *&'以便有一個左值,您可以將其賦值。 – 2011-04-25 04:59:18

+0

doh! ...在這裏得到太晚:D – regu 2011-04-25 05:01:47

回答

3

您與T = double * const實例constness(一個const限定指針到非const限定double)。

const T& get()中,const適用於整個T。如果Tint*,那麼const T將是int* const,而不是const int*。所以在你的具體情況下,const不起作用,因爲T已經是const限定的(它是一個double* const)。

當您有類型名稱如T時,將constvolatile添加到typename始終適用於頂級,無論類型是什麼。所以,const TT const總是相同的,不管什麼T是。

+0

感謝您的解釋,不幸的是意味着我的設計將無法正常工作:D – regu 2011-04-25 05:20:30