为什么我可以在没有错误的情况下更改const值?
void foo(long * a)
{
*a = 50;
}
int _tmain(int argc, _TCHAR* argv[])
{
const long a = 7;
const long * b = &a;
foo((long *)b);
// now the value of a is 50
}
答案 0 :(得分:4)
你不。
当您编写C风格的演员表时,您禁用了支票。如果你写了这个:
foo(static_cast<long*>(b));
或只是
foo(b);
那么你的程序就不会编译了。
为了让你做专家魔术,你仍然可以写:
foo(const_cast<long*>(b));
但是它仍然你的责任,以确保你不会将它用于邪恶,例如你的例子中的邪恶。
答案 1 :(得分:4)
因为你使用施法(long*)
来施放常量。当您尝试修改const
对象时,您的程序会产生未定义的行为。
特别是在构建指针时,你应该依赖于C ++ - 强制转换(static_cast
,reinterpret_cast
),它们不会像C风格的强制转换那样隐式地抛弃const。这只能使用const_cast
显式地完成,foo(b);
几乎专门用于缺乏const正确性的API(和一些黑客)。
如果你试图在没有强制转换的情况下传递参数(这通常应该将参数传递给函数):
{{1}}