首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const_cast对reinterpret_cast

const_cast对reinterpret_cast
EN

Stack Overflow用户
提问于 2013-01-11 06:01:12
回答 5查看 23.6K关注 0票数 8

引用SO C++ FAQ cast be used?

const_cast用于将const移除或添加到变量中,它是唯一可靠的、定义的和合法的消除常数的方法。reinterpret_cast用于更改类型的解释。

我以一种合理的方式理解了为什么一个const变量应该只使用const_cast传递给非const,但我不能找到一个合理的理由,使用reinterpret_cast而不是const_cast来增加一致性。

我知道使用reinterpret_cast来增加一致性也不是明智的,但是使用reinterpret_cast来增加一致性是UB还是潜在的定时炸弹呢?

我在这里感到困惑的原因是因为

在很大程度上,使用reinterpret_cast获得的唯一保证是,如果将结果转换回原始类型,则会得到完全相同的值。

因此,如果我使用reinterpret_cast添加常数,如果您将结果返回到原始类型,则结果应该返回原始类型,而不应该是UB,但这违反了这样一个事实,即人们只应该使用const_cast来移除常数。

在另一个说明中,您可以使用重新解释大小写来添加Constness的标准保证

5.2.10重新解释cast (7)将“指向......When”类型的are转换为“指针到cv T2”类型,如果T1和T2都是标准布局类型(3.9),则结果是static_cast(static_cast(v)),而T2的对齐要求并不比T1的要求严格.

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-11 06:16:11

reinterpret_cast更改对象内数据的解释。const_cast添加或删除const限定符。数据表示和一致性是正交的。因此,有不同的转换关键字是有意义的。

因此,如果我使用reinterpret_cast添加常数,如果您将结果返回到原始类型,则结果应该返回原始类型,而不应该是UB,但这违反了这样一个事实,即人们只应该使用const_cast来移除常数。

甚至不会编译:

代码语言:javascript
复制
int * n = new int;
const * const_added = reinterpret_cast<const int *>(n);
int * original_type = reinterpret_cast<int*>(const_added);
    // error: reinterpret_cast from type ‘const int*’ to type ‘int*’ casts away qualifiers
票数 15
EN

Stack Overflow用户

发布于 2013-01-11 06:16:52

您不应该只是在reinterpret_cast中添加reinterpret_castreinterpret_cast应该主要是:重新解释指针(或其他什么)。

换句话说,如果您要从const char*转到char* (希望是因为有一个不好的API不能更改),那么const_cast就是您的朋友。这就是我想要做的。

但是,如果您需要从MyPODType*转到const char*,那么您就需要reinterpret_cast,而它只是因为不需要在上面添加const_cast而表现得很好。

票数 6
EN

Stack Overflow用户

发布于 2013-01-11 06:48:56

有一件事要记住:不能使用const_cast使const变量可写。只有当非const引用指向非const对象时,才能使用它从const引用中检索非const引用。听起来很复杂?示例:

代码语言:javascript
复制
// valid:
int x;
int const& x1 = x;
const_cast<int&>(x1) = 0;
// invalid:
int const y = 42;
int const& y1 = y;
const_cast<int&>(y1) = 0;

在现实中,这两者都会编译,有时甚至是“工作”。但是,第二种方法会导致未定义的行为,并且在许多情况下,当常量对象被放置在只读内存中时,程序将终止。

尽管如此,还有几点:reinterpret_cast是最强大的演员,也是最危险的演员,所以除非你必须使用它,否则不要使用它。当您需要从void*sometype*时,请使用static_cast。当走向相反的方向时,也要使用内置的隐式转换或显式static_cast。与添加或删除const类似,这也是隐式添加的。关于reinterpret_cast,也请参阅在cast中讨论的另一种不太麻烦的选项。

乌利

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14272578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档