删除模板化函数中的常量

时间:2018-01-16 11:12:34

标签: c++ c++11 templates const const-cast

我在删除使用模板化函数的常量时遇到了一些问题。

#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用于我的功能。

2 个答案:

答案 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 inttypename std::remove_const<T>::type得到int,则上述代码与const_cast<int &>(param)...相同。

请注意,cx是一个常量,尝试通过从const_cast引用到UB的引用来修改它。对于rx它没关系,实际上它指的是非常数。