const_cast比普通演员更安全吗?

时间:2012-07-27 00:05:05

标签: c++

哪个更安全?

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

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

5 个答案:

答案 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风格的演员阵容可能会转移到staticreinterpretconst演员阵容或这三者的组合,或者是一个可以访问私人基地的奇怪时髦演员原因。关键是,在这个用例中,它完全等同于const_cast

答案 2 :(得分:1)

我不确定安全性 - 我确信有人比我更精通 - 但C ++风格的演员阵容是语言标准的一部分,应该始终优于C风格的演员阵容(如既有风格又有可读性。

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

答案 3 :(得分:1)

两者都不比另一个更安全。在这两种情况下,如果通过其中一个已经转换的指针修改值,则会发生未定义的行为。 const_cast的好处是你想要的东西,并清楚地表达它,而C样式演员可能是一切,并且对其参数的实际类型不敏感。

答案 4 :(得分:1)

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

它更安全,因为你明确声明你正在抛弃const ness

当有人看到你的代码时,他们会想 - “好吧,这是一个const_cast,这个论点一定是const。让我们仔细研究一下这个”,而常规演员只会在后面丢失。阅读大块代码时的头脑。