删除模板化函数中的常量

问题描述 投票:3回答:2

删除使用模板化函数的常量我有一点问题。

#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

c++ c++11 templates const const-cast
2个回答
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它很好,它实际上指的是非常数。


6
投票

你可以尝试做这样的事情:

template< typename T>
void fct(const T&  param)
{
  const_cast<T&>(param) = 40;    
}

模板类型T必须是引用,否则您的演员表没有任何意义

© www.soinside.com 2019 - 2024. All rights reserved.