0

C++ 标准提到这reinterpret_cast是实现定义的,并且不提供任何保证,除了将(使用reinterpret_cast)转换回原始类型将导致原始值传递给 first。

至少某些类型的 C 风格转换的行为方式大致相同 - 以相同的值来回转换结果 - 目前我正在使用枚举和ints,但还有一些其他示例。

虽然 C++ 标准为两种类型转换提供了这些定义,但它是否也为混合类型转换提供了相同的保证?如果库 X 从函数返回int Y()某个值,可以使用上述任何一种转换,而不必担心在 Y 的主体enum中使用什么转换将初始转换enum为?int我没有 X 的源代码,所以我无法检查(无论如何它可能会随着下一个版本而改变),并且在文档中几乎没有提到类似的事情。

我知道在这种情况下的大多数实现下,两种强制转换的行为都是一样的;我的问题是:C++ 标准对这种情况有什么看法——如果有的话。

4

3 回答 3

4

C++ 根据和定义 C 强制转换语法的static_cast语义。因此,无论您使用何种语法来实现相同的操作,您都可以获得相同的保证。const_castreinterpret_cast

于 2012-11-14T17:01:35.563 回答
2

reinterpret_cast只能用于特定的转换:

  • 指向(足够大的)整数的指针,反之亦然
  • 函数指针指向函数指针
  • 对象指针指向对象指针
  • 指向成员的指针到指向成员的指针
  • 要引用的左值表达式

加上(有条件地)指向对象指针的函数指针,反之亦然。在大多数情况下,转换后的值是未指定的,但可以保证转换后的转换将产生原始值。

特别是,您不能使用reinterpret_cast在整数和枚举类型之间进行转换;必须使用static_cast(或隐式地,将无作用域的枚举转换为整数类型时)进行转换,这对于足够大的整数类型是明确定义的。唯一可能的问题是图书馆是否做了一些完全疯狂的事情,例如return reinterpret_cast<int&>(some_enum);

C 风格的强制转换将执行 astatic_cast或 a reinterpret_cast,然后根据const_cast需要执行 a ;因此,任何由 定义的转换static_cast也由 C 样式转换定义。

于 2012-11-14T17:48:29.037 回答
1

不,reinterpret_cast等同于 C 风格的演员表。C 风格的强制转换允许抛弃 const-volatile(因此它包括 的功能)不允许在. 如果在源类型和目标类型之间允许,它将执行与 具有不同语义的 a 。如果不允许转换,它将回退到. 最后还有一个极端情况,C 转换不能用任何其他转换来表示:它忽略了访问说明符。const_castreinterpret_caststatic_caststatic_castreinterpret_castreinterpret_cast

一些说明差异的示例:

class b0 { int a; };
class b1 { int b; };
class b2 { int c; };
class d : public b0, public b1, b2 {};
int main() {
   d x;
   assert( static_cast<b1*>(&x) == (b1*)&x );
   assert( reinterpret_cast<b1*>(&x) != (b1*)&x ); // Different value
   assert( reinterpret_cast<b2*>(&x) != (b2*)&x ); // Different value, 
                                                   // cannot be done with static_cast
   const d *p = &x;
   // reinterpret_cast<b0*>(p);                    // Error cannot cast const away
   (b0*)p;                                         // C style can
}
于 2012-11-14T19:10:07.903 回答