使用指针c ++违反const变量

时间:2015-01-22 12:29:55

标签: c++

为什么我可以在没有错误的情况下更改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
}

2 个答案:

答案 0 :(得分:4)

当您编写C风格的演员表时,您禁用了支票。如果你写了这个:

foo(static_cast<long*>(b));

或只是

foo(b);

那么你的程序就不会编译了。

为了让你做专家魔术,你仍然可以写:

foo(const_cast<long*>(b));

但是它仍然的责任,以确保你不会将它用于邪恶,例如你的例子中的邪恶。

答案 1 :(得分:4)

因为你使用施法(long*)来施放常量。当您尝试修改const对象时,您的程序会产生未定义的行为。

特别是在构建指针时,你应该依赖于C ++ - 强制转换(static_castreinterpret_cast),它们不会像C风格的强制转换那样隐式地抛弃const。这只能使用const_cast显式地完成,foo(b); 几乎专门用于缺乏const正确性的API(和一些黑客)。
如果你试图在没有强制转换的情况下传递参数(这通常应该将参数传递给函数):

{{1}}

您将获得an appropriate error message