【发布时间】:2018-08-25 21:32:42
【问题描述】:
我对 reinterpret_cast 的心智模型一直是,将表达式的位序列视为不同类型,而 cppreference(注意:这不是 C++ 标准的引用)似乎同意这一点:
与
static_cast不同,但与const_cast类似,reinterpret_cast表达式不会编译为任何 CPU 指令。它纯粹是一个编译器指令,指示编译器将 expression 的位序列(对象表示)视为具有 new_type 类型。
在寻找保证时,我偶然发现了[expr.reinterpret.cast] 下的一个注释:
[ 注意:
reinterpret_cast执行的映射可能会或可能不会产生与原始值不同的表示。 — 尾注 ]
这让我想知道:reinterpret_cast 在什么条件下会产生一个对象表示与原始值不同的值?
【问题讨论】:
-
没有强制转换会改变它们所应用的对象,如果这是您所要求的。
-
@NeilButterworth:我不觉得,那个编辑添加了任何已经不存在的东西。
-
立即想到一种情况,即不同的指针类型具有不同的对齐要求并主动将低位位清零。在这样的平台上,从不太严格的对齐要求转换为更严格的对齐要求将使一些位清零。
-
@AnT:这帮助我理解了,为什么
reinterpret_cast往返 (T1*→T2*→T1*) 只保证返回相同的对象表示,以防@987654333 @ 的对齐要求不比T1严格。谢谢你。
标签: c++ language-lawyer