【发布时间】:2012-07-19 18:41:10
【问题描述】:
我正在尝试使用 const_cast 运算符并尝试覆盖作为参数传递的参数 o 的 const 状态:
void function1 (const Object *o)
{
...
function2( const_cast < Object *> ( o ) ); //Exception in g++
}
void function2 (Object *o) {}
但是覆盖 o 的 const 状态会在 g++ (GNU/Linux) 中引发异常,在 VS 2010 (Win) 中它运行良好......
有没有更可靠的方法来覆盖函数参数的 const 状态?
更新:
MSDN 写道:不能使用 const_cast 运算符直接覆盖常量变量的常量状态 :-(.
【问题讨论】:
-
您遇到了什么异常?您发布的代码在 g++ 中很好。
-
请告诉我们你在哪里调用
function1(),并记住使用const_cast从真正的常量对象(在这种情况下为const Object)中删除常量会导致未定义的行为,包括例外情况。 -
你能把你展示的代码做成一个完整(但仍然很小)的例子吗?很难理解你从这个片段中看到了什么。
-
@cdhowie:仅当有人使用生成的指向非 const 的指针尝试修改对象时。
const int i = 0; int *p = const_cast<int*>(&i); std::cout << *p;可以。 -
const_cast并不神奇,它几乎所有天真的删除 CV 的用途实际上都是未定义的行为。它仅适用于strchr之类的东西,您可以将一段代码重用于两个不同的常量。
标签: c++ constants undefined-behavior const-cast