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);