C++;鉴定转换-常数和模板 在下面的代码中,我试图找出编译器(MSDEV C++ 2010和COMMO)为什么不考虑非专用模板获取函数返回类型为const的原因。我希望CASE#2(参见代码snipet)不会编译,但它确实编译了。有什么想法或联系吗
谢谢你,雷古C++;鉴定转换-常数和模板 在下面的代码中,我试图找出编译器(MSDEV C++ 2010和COMMO)为什么不考虑非专用模板获取函数返回类型为const的原因。我希望CASE#2(参见代码snipet)不会编译,但它确实编译了。有什么想法或联系吗,c++,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) {}
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;
};
模板
结构常数
{
T值;
常量():值(0){}
const T&get(){return value;}
};
模板
结构常数
{
T*常数值;
常量():值(0){}
const T*const&get(){return value;}
};
int main(int argc,const char*argv[]
{
//使用专门的
常数wconstance;
const_cast(wconstance.value)=新的双精度(1);
*wconstance.get()=12.0;//不编译CASE#1
//使用非专业
常数wConstness2;
const_cast(wConstness2.value)=新的双精度(1);
*wConstness2.get()=12.0;//编译CASE#2,允许修改
//wConstness2.value指向的值
返回0;
};
使用T
=double*const
(指向非const-qualifieddouble
的const-qualified指针)实例化constness
在const T&get()
中,const
应用于整个T
。如果T
是int*
,那么const T
将是int*const
,而不是const int*
。因此,在您的特定情况下,const
无效,因为T
已经是const限定的(它是一个双*const
)
当您有一个像
T
这样的类型名时,无论类型是什么,向类型名添加const
或volatile
总是在顶层应用。因此,const T
和T const
总是相同的,不管T
是什么。const\u cast(wConstness2.value)=新的双精度(1)
错误:强制转换的目标类型需要是double*&
,以便有一个可分配给.doh!的左值。。。太晚了:D谢谢你的解释,不幸的是,这意味着我的设计无法工作:D