void * with static_cast vs intptr_t with reinterpret_cast

时间:2011-10-27 14:02:37

标签: c++

我想知道两种不同类型的特定类型的演员之间是否存在特定的,基于标准的差异。特别是,给定:类型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_castreinterpret_cast的一般情况不感兴趣,我很清楚。我感兴趣的是上述非常具体的情况 - 由标准分配给static_castvoid*的特殊逻辑,使其行为类似于reinterpret_cast(StackOverflow上有几个相关问题,但它们更通用,我认为我的场景非常具体)

除了风格和偏好之外,是否有任何技术原因可以解决为什么应该使用一种形式?或者是否有保证,所有T生成相同的最终result变量?

1 个答案:

答案 0 :(得分:15)

是的,两者都保证恢复原始指针值。

第一个由C ++ 11 5.2.10 / 5指定:

  

转换指针   到一个足够大小的整数(如果在实现上存在任何这样的整数)并返回到相同的指针类型   将具有其原始价值;

第二个由C ++ 11 5.2.9 / 13指定:

  

指向对象的类型指针的值   转换为“指向cv void的指针”并返回,可能具有不同的cv-qualification,应具有其原始值   值。

有一个技术上的理由比第一个版本更喜欢第二个版本:intptr_t是可选的,但每个实现都有void*