在下面的代码中,我试图弄清楚为什么编译器(msdev c++ 2010 和 Comeau)不将非专用模板 get 函数的返回类型视为 const。我希望 CASE #2(参见代码片段)无法编译,但它确实编译了。有什么想法或链接吗?
谢谢你,雷古
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;
};
最佳答案
您实例化constness
与 T
=double * const
(指向非 const 限定 double
的 const 限定指针)。
在 const T& get()
,const
适用于整体T
。如果T
是int*
,然后const T
将是int* const
,不是const int*
。因此,在您的具体情况下,const
没有效果,因为 T
已经是 const 限定的(它是 double* const
)。
当您的类型名称类似于 T
时,添加const
或volatile
无论类型是什么,类型名始终适用于顶层。所以,const T
和T const
无论什么,总是相同的T
是。
关于C++ 限定转换 - 常量和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775208/