删除使用模板化函数的常量我有一点问题。
#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
。
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
它很好,它实际上指的是非常数。
你可以尝试做这样的事情:
template< typename T>
void fct(const T& param)
{
const_cast<T&>(param) = 40;
}
模板类型T必须是引用,否则您的演员表没有任何意义