似乎广泛认为类型惩罚通过reinterpret_cast
某种方式被禁止(正确地说:"未定义的行为",即" 本国际标准没有要求的行为 ",并明确指出实现可以在C++中定义行为).使用以下推理不同意我是不正确的,如果是这样,为什么?
如果类型"指向" 的表达式可以使用a 显式转换为"指向" 的类型,则
T1
可以将类型的glvalue表达式强制转换为"引用T2
"类型.结果引用与源glvalue相同的对象,但具有指定的类型.[注意:也就是说,对于左值,参考演员与使用内置和运算符的转换具有相同的效果(同样适用于). - 结束注释]不创建临时,不进行复制,也不调用构造函数或转换函数.T1
T2
reinterpret_cast
reinterpret_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
,如:
static_cast
在指针的情况下应该足够了,[expr.static.cast]/13和[conv.ptr]/2 ; 和void …