在下面的代码中,我试图找出编译器(msdev c ++ 2010和Comeau)为什么不将非专用模板get函数的返回类型视为const的原因。我希望CASE#2(参见代码snipet)不能编译,但确实如此。任何想法或链接?
谢谢你,regu
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 :(得分:3)
使用constness
= T
(一个指向非const限定double * const
的const限定指针)实例化double
。
在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
是什么。