我想知道两种不同类型的特定类型的演员之间是否存在特定的,基于标准的差异。特别是,给定:类型T
和变量T * object
是:
intptr_t opaque = reinterpret_cast<intptr_t>( object );
T * result = reinterpret_cast<T*>( opaque );
相当于:
void * opaque = static_cast<void*>( object );
T * result = static_cast<T*>( opaque );
我只关心result
,它是否保证是相同的值,相当于任何类型object
的原始T
?我不关心中间opaque
具有什么位模式,因为我认为标准在技术上允许它们在每种情况下都不同(尽管没有理智的编译器会有不同的结果)。
注意,我对static_cast
与reinterpret_cast
的一般情况不感兴趣,我很清楚。我感兴趣的是上述非常具体的情况 - 由标准分配给static_cast
和void*
的特殊逻辑,使其行为类似于reinterpret_cast
。 (StackOverflow上有几个相关问题,但它们更通用,我认为我的场景非常具体)
除了风格和偏好之外,是否有任何技术原因可以解决为什么应该使用一种形式?或者是否有保证,所有T
生成相同的最终result
变量?
答案 0 :(得分:15)
是的,两者都保证恢复原始指针值。
第一个由C ++ 11 5.2.10 / 5指定:
转换指针 到一个足够大小的整数(如果在实现上存在任何这样的整数)并返回到相同的指针类型 将具有其原始价值;
第二个由C ++ 11 5.2.9 / 13指定:
指向对象的类型指针的值 转换为“指向cv void的指针”并返回,可能具有不同的cv-qualification,应具有其原始值 值。
有一个技术上的理由比第一个版本更喜欢第二个版本:intptr_t
是可选的,但每个实现都有void*
。