我在删除使用模板化函数的常量时遇到了一些问题。
#include <iostream>
using namespace std;
template< typename T>
void fct(T& param)
{
const_cast<T>(param) = 40;
}
int _tmain(int argc, _TCHAR* argv[])
{
int x = 30;
const int cx = x;
const int& rx = x;
fct(cx);
return 0;
}
当我跑步时,我得到:
错误C2440:'const_cast':无法从'int'转换为'int'
我怎样才能将const_cast
用于我的功能。
答案 0 :(得分:6)
你可以尝试这样做:
template< typename T>
void fct(const T& param)
{
const_cast<T&>(param) = 40;
}
模板类型T必须是引用,否则您的演员阵容没有任何意义
答案 1 :(得分:4)
const_cast<T>(param) = 40;
无法执行您想要的操作,fct(cx);
和fct(rx);
,T
被推断为const int
。
如果要删除constness,即获取对非const的引用,可以使用std::remove_const
:
const_cast<typename std::remove_const<T>::type &>(param) = 40;
对于T
推断为const int
,typename std::remove_const<T>::type
得到int
,则上述代码与const_cast<int &>(param)...
相同。
请注意,cx
是一个常量,尝试通过从const_cast
引用到UB的引用来修改它。对于rx
它没关系,实际上它指的是非常数。