小编pan*_*ers的帖子

reinterpret_cast类型是否实际上是未定义的行为?

似乎广泛认为类型惩罚通过reinterpret_cast某种方式被禁止(正确地说:"未定义的行为",即" 本国际标准没有要求的行为 ",并明确指出实现可以在C++中定义行为).使用以下推理不同意我是不正确的,如果是这样,为什么


[expr.reinterpret.cast]/11州:

如果类型"指向" 的表达式可以使用a 显式转换为"指向" 的类型,则T1可以将类型的glvalue表达式强制转换为"引用T2"类型.结果引用与源glvalue相同的对象,但具有指定的类型.[注意:也就是说,对于左值,参考演员与使用内置和运算符的转换具有相同的效果(同样适用于). - 结束注释]不创建临时,不进行复制,也不调用构造函数或转换函数.T1T2reinterpret_­castreinterpret_­cast<T&>(x)*reinterpret_­cast<T*>(&x)&*reinterpret_­cast<T&&>(x)

用脚注:

75)这有时被称为类型双关语.

/ 11隐含地,通过示例,带有/ 6到/ 10的限制,但也许最常见的用法(双关语对象)在[expr.reinterpret.cast]/7中解决:

可以将对象指针显式转换为不同类型的对象指针.当v对象指针类型的prvalue 转换为对象指针类型"指向cv T"时,结果为static_­cast<cv T*>(static_­cast<cv void*>(v)).[注意:将"指向T1"的类型的prvalue转换为"指向"的类型T2(T1 and T2对象类型和对齐要求的T2位置不比那些更严格T1)并返回其原始类型会产生原始指针值. - 结束说明]

显然,目的不能转换为/从指针或引用void,如:

  1. / 7中的例子清楚地表明,static_cast在指针的情况下应该足够了,[expr.static.cast]/13[conv.ptr]/2 ; 和
  2. [转换为]引用void …

c++ casting language-lawyer reinterpret-cast type-punning

5
推荐指数
1
解决办法
515
查看次数