哪个更安全?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
答案 0 :(得分:8)
在某种意义上说,除了删除const
之外,你不会得到其他东西更安全:
int main()
{
const char i=5;
int *ptr;
ptr=(int*)&i; // the compiler won't complain
ptr=const_cast<int*>(&i); // will fail, since `i` isn't an int
return 0;
}
这并不意味着const_cast<>
是安全的:
const int i=5;
int main()
{
int const& cri(i);
int& ri = const_cast<int&>(cri); // unsafe
ri = 0; // will likely crash;
return 0;
}
答案 1 :(得分:2)
它们是完全等效的,除了C风格的演员表比const_cast
更令人担忧。如果代码被及时冻结,它们将是相同的。一些标准表示,C风格的演员阵容可能会转移到static
,reinterpret
或const
演员阵容或这三者的组合,或者是一个可以访问私人基地的奇怪时髦演员原因。关键是,在这个用例中,它完全等同于const_cast
。
答案 2 :(得分:1)
我不确定安全性 - 我确信有人比我更精通 - 但C ++风格的演员阵容是语言标准的一部分,应该始终优于C风格的演员阵容(如既有风格又有可读性。
为了修改我的答案,似乎C ++样式的强制转换由编译器检查,而C样式的强制转换在运行时失败;在这方面,C ++风格的演员阵容肯定更安全。
答案 3 :(得分:1)
两者都不比另一个更安全。在这两种情况下,如果通过其中一个已经转换的指针修改值,则会发生未定义的行为。 const_cast
的好处是只你想要的东西,并清楚地表达它,而C样式演员可能是一切,并且对其参数的实际类型不敏感。
答案 4 :(得分:1)
它更安全,但方式与你想象的不同。
它更安全,因为你明确声明你正在抛弃const
ness 。
当有人看到你的代码时,他们会想 - “好吧,这是一个const_cast
,这个论点一定是const。让我们仔细研究一下这个”,而常规演员只会在后面丢失。阅读大块代码时的头脑。