C++ 消除模板函数中的常数

C++ 消除模板函数中的常数,c++,c++11,templates,constants,const-cast,C++,C++11,Templates,Constants,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

我有一个小问题,就是如何消除使用模板函数的常量

#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;
}
#包括
使用名称空间std;
模板
无效fct(T和参数)
{
常数(参数)=40;
}
int _tmain(int argc,_TCHAR*argv[]
{
int x=30;
常数int cx=x;
常数int&rx=x;
fct(cx);
返回0;
}
当我运行此命令时,我得到:

错误C2440:'const_cast':无法从'int'转换为'int'


如何在函数中使用
const\u cast

您可以尝试这样做:

template< typename T>
void fct(const T&  param)
{
  const_cast<T&>(param) = 40;    
}
模板
无效fct(常数T和参数)
{
常数(参数)=40;
}
模板类型T必须是引用,否则您的强制转换没有任何意义

const_cast(param)=40fct(cx)和
fct(cx),code>不做您想要的事情和<代码>fct(rx)
T
被推导为
const int

如果要删除常量,即获取对非常量的引用,可以使用:

const_cast(参数)=40;
对于
T
被推断为
const int
typename std::remove_const::type
导致
int
,则上述代码与
const_cast(param)…
相同


请注意,
cx
是一个常量,尝试通过从
const\u cast
获取的引用修改它会导致UB。对于
rx
没关系,它实际上指的是一个非常数。

不管有什么错误,你想做的都是一个坏主意。@KillzoneKid
T
怎么可能是
int
?他正在传递一个
const int&
,它与
T&
匹配,因此
T
被推断为
const int
@oisyn他编辑了这个问题,通过一个非常量访问路径修改一个const对象是UBYes@AMA,但出于好奇,我想知道如何删除这个const;DAside由于目标不明确,我更喜欢这个简单的答案。不需要类型特征,让te编译器通过显式指定导出类型的
const
。当然,不同的版本做的并不完全相同:这一个绑定到右值,另一个不绑定。根据您的要求,它可以是赞成的也可以是反对的。对不起,我使用的是C++11:/not 14*@Blood HaZaRd Revised。@Blood HaZaRd很好。是的,我确实读过,但我遗漏的是成员类型
type
@Blood HaZaRd这就是为什么C++14使它更简单<代码>类型名称标准::删除常量::类型
=>
std::删除常量
const_cast<typename std::remove_const<T>::type &>(param) = 40;