2011-04-25 54 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