使用哪个更安全?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
使用哪个更安全?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
从某种意义上说,它更安全,因为您不会得到除了删除之外的其他东西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;
}
它们是完全等价的,只是 C 风格的转换比const_cast
. 如果代码及时冻结,它们将是相同的。标准说,C 风格的演员表可能会演变为static
、reinterpret
、const
演员表或三者的组合,或者出于某种原因可以访问私人基地的奇怪时髦演员表。关键是,在这个用例中,它完全等同于const_cast
.
我不确定安全性——我敢肯定有人比我更精通这一点——但是 C++ 风格的强制转换是语言标准的一部分,应该总是优先于 C 风格的强制转换(作为一个问题风格和可读性)。
为了修改我的答案,编译器似乎检查了 C++ 风格的转换,而 C 风格的转换在运行时失败;在这方面,C++ 风格的强制转换肯定更安全。
两者都不比另一个更安全。在这两种情况下,如果您通过已转换的指针之一修改值,都会发生未定义的行为。const_cast
这样做的好处是只做你想做的事情并清楚地表达出来,而 C 风格的转换可以是一切,并且对其参数的实际类型不敏感。
它更安全,但方式与您想象的不同。
它更安全,因为您明确声明您正在抛弃const
ness。
当有人看到你的代码时,他们会想——“好吧,这里是一个const_cast
,这个参数一定是 const。让我们仔细看看这个”,而在阅读大块代码时,常规演员只会迷失在脑海中.