3

使用哪个更安全?

int main()
{
    const int i=5;
    int *ptr;
    ptr=(int*)&i; <------------------- first

    ptr=const_cast<int*>(&i); <-------------------Second
    return 0;
}
4

5 回答 5

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;
}
于 2012-07-27T00:09:55.180 回答
2

它们是完全等价的,只是 C 风格的转换比const_cast. 如果代码及时冻结,它们将是相同的。标准说,C 风格的演员表可能会演变为staticreinterpretconst演员表或三者的组合,或者出于某种原因可以访问私人基地的奇怪时髦演员表。关键是,在这个用例中,它完全等同于const_cast.

于 2012-07-27T00:08:52.260 回答
1

我不确定安全性——我敢肯定有人比我更精通这一点——但是 C++ 风格的强制转换是语言标准的一部分,应该总是优先于 C 风格的强制转换(作为一个问题风格和可读性)。

为了修改我的答案,编译器似乎检查了 C++ 风格的转换,而 C 风格的转换在运行时失败;在这方面,C++ 风格的强制转换肯定更安全。

于 2012-07-27T00:07:00.887 回答
1

两者都不比另一个更安全。在这两种情况下,如果您通过已转换的指针之一修改值,都会发生未定义的行为。const_cast这样做的好处是只做想做的事情并清楚地表达出来,而 C 风格的转换可以是一切,并且对其参数的实际类型不敏感。

于 2012-07-27T00:09:06.217 回答
1

它更安全,但方式与您想象的不同。

它更安全,因为您明确声明您正在抛弃constness

当有人看到你的代码时,他们会想——“好吧,这里是一个const_cast,这个参数一定是 const。让我们仔细看看这个”,而在阅读大块代码时,常规演员只会迷失在脑海中.

于 2012-07-27T00:20:15.167 回答