const_cast比普通的cast更安全吗?

3
哪个更安全使用?
int main()
{
    const int i=5;
    int *ptr;
    ptr=(int*)&i; <------------------- first

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

3
也许两种方法都不太好,但如果你遇到了绝对必须这样做的情况,使用 const_cast 更能明确表达你所需的操作。 - chris
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;
}

2
除了 C 风格的强制类型转换可能更难维护 const_cast 之外,它们完全等效。如果代码被冻结在时间上,它们将是相同的。标准规定,C 风格的强制类型转换可能退化为 staticreinterpretconst 强制类型转换或这三者的组合,或者一个奇怪的花哨强制类型转换,可以出于某种原因访问私有基类。关键是,在这种用例中,它与 const_cast 完全等效。

1

我不确定安全性 - 我相信有人比我更熟悉这个问题 - 但是C++风格的转换是语言标准的一部分,应该始终优先选择它们而不是C风格的转换(无论是从样式还是可读性的角度考虑)。

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


不,它们完全相同。 - Puppy
该(高票)答案是错误的;s:https://dev59.com/questions/63I-5IYBdhLWcg3w6tJR - David Titarenco

1

两者都不比另一个更安全。在这两种情况下,如果您通过其中一个已转换的指针修改值,则会发生未定义的行为。const_cast的好处是只做您想要的事情并清晰地表达它,而C风格的转换可能是任何东西,并且不敏感于其参数的实际类型。


1

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

它更安全,因为您明确声明了您正在丢弃const

当有人看到您的代码时,他们会想 -“好的,这里有一个const_cast,这个参数一定是const。让我们仔细看看这个”,而常规转换只会在阅读大块代码时被忽略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接