Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针c+违反常量变量+;_C++ - Fatal编程技术网

C++ 使用指针c+违反常量变量+;

C++ 使用指针c+违反常量变量+;,c++,C++,为什么允许我在没有错误的情况下更改常量值 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 } 你不是。 编写C样式转换时,禁用了检查。如果你写了这个: foo(static_cast&

为什么允许我在没有错误的情况下更改常量值

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
}
你不是。

编写C样式转换时,禁用了检查。如果你写了这个:

foo(static_cast<long*>(b));
那么你的程序就不会编译了

为了让您能够使用专家级魔法,您仍然可以编写:

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

但是,你仍然有责任确保你不使用它来作恶,比如你的例子中的邪恶。

因为你用施法者
(long*)
铸造了常数。当您试图修改
const
对象时,程序会产生未定义的行为

特别是在强制转换指针时,您应该依赖C++强制转换(
静态强制转换
重新解释强制转换
),它不会像C样式强制转换那样隐式地丢弃常量。这只能通过使用
const_cast
显式实现,它几乎只用于缺少const正确性的API(以及一些hack)。
如果尝试在不使用强制转换的情况下传递参数(这是参数通常应传递给函数的方式):


你会得到。

咯咯笑你说“性别”@LightnessRacesinOrbit噢lol你说得对(我等不及13:o了))我建议你读一下逻辑与按位
常量的比较。你可以做你刚才做的事情,但你不应该做,因为它违反了变量的逻辑常数。@lightness race sinorbit这很公平,但我看到了很多,这是我第一次看到有人要求这样做。我想我会觉得很特别。@Barry:我也经常看到。最近越来越多。真遗憾(
foo(const_cast<long*>(b));
foo(b);