C ++

引用SO C ++常见问题什么时候应该使用static_cast,dynamic_cast和reinterpret_cast ?.

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

我理解一个合理的方式,为什么一个const变量只能使用const_cast转换为非const,但我无法找到使用reinterpret_cast代替const_cast来添加const的合理理由。

我明白,使用reinterpret_cast甚至添加常量不是理智的,但它会是一个UB或潜在的时间炸弹使用reinterpret_cast添加常量?

我在这里困惑的原因是因为声明

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

因此,如果我使用reinterpret_cast添加常量,并且如果将reinterpret_cast结果重新初始化为原始类型,它应该返回原始类型并且不应该是UB,但是这违反了只应使用const_cast来移除常量的事实

在单独的注释中,标准保证您可以使用reinterpret case添加Constness

5.2.10重新解释cast(7)......当“指向T1的指针”类型的prvalue v被转换为类型“指向cv T2的指针”时,结果为static_cast(static_cast(v)),如果两个T1和T2是标准布局类型(3.9),并且T2的对齐要求不比T1更严格。


reinterpret_cast更改对象内数据的解释。 const_cast添加或删除const限定符。 数据表示和常量是正交的。 所以有不同的演员关键字是有意义的。

因此,如果我使用reinterpret_cast添加常量,并且如果将reinterpret_cast结果重新初始化为原始类型,它应该返回原始类型并且不应该是UB,但是这违反了只应使用const_cast来移除常量的事实

这甚至不会编译:

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

你不应该只是用reinterpret_cast添加constreinterpret_cast应该主要是:重新解释指针(或其他)。

换句话说,如果你从const char*char* (希望是因为有一个糟糕的API你不能改变),那么const_cast就是你的朋友。 这就是它的本意。

但是如果你需要从MyPODType*const char* ,你需要reinterpret_cast ,而且它不需要const_cast就可以了。


有一点需要记住:你不能使用const_cast来使const变量可写。 如果该常量引用引用非常量对象,则只能用它从常量引用中检索非常量引用。 听起来很复杂? 例:

// 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 ,另请参阅C ++中的讨论何时应该更倾向于使用两个链接的static_cast而不是reinterpret_cast,其中讨论的是一个不太讨厌的替代方案。

乌利

链接地址: http://www.djcxy.com/p/4913.html

上一篇: c++

下一篇: What is the difference between static