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
添加const
。 reinterpret_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++