重新解释类型转换和c样式转换是否兼容(按c+;+;标准)? < > C++标准提到 ReRealtTyStudio是实现定义的,并且不提供任何保证,除非将原代码返回到原始类型中(使用 RealTytCase)将导致原始值传递到第一。p>

重新解释类型转换和c样式转换是否兼容(按c+;+;标准)? < > C++标准提到 ReRealtTyStudio是实现定义的,并且不提供任何保证,除非将原代码返回到原始类型中(使用 RealTytCase)将导致原始值传递到第一。p>,c++,casting,reinterpret-cast,C++,Casting,Reinterpret Cast,至少某些类型的C样式转换的行为方式基本相同-使用相同的值来回转换结果-目前我正在使用枚举和ints,但也有一些其他示例 虽然C++标准为两种类型的铸造提供了定义,但它也为混合型铸件提供了相同的保证吗?如果库X从函数int Y()返回一些enum值,则可以使用上述任何类型转换,而不必担心Y的主体中使用了什么类型转换来将初始enum转换为int?我没有X的源代码,所以我无法检查(并且它可以随下一个版本而更改),文档中很少提到类似的内容 我知道在大多数实现中,在这种情况下,两个类型转换的行为相同;我的

至少某些类型的C样式转换的行为方式基本相同-使用相同的值来回转换结果-目前我正在使用枚举和
int
s,但也有一些其他示例

虽然C++标准为两种类型的铸造提供了定义,但它也为混合型铸件提供了相同的保证吗?如果库X从函数
int Y()
返回一些
enum
值,则可以使用上述任何类型转换,而不必担心Y的主体中使用了什么类型转换来将初始
enum
转换为
int
?我没有X的源代码,所以我无法检查(并且它可以随下一个版本而更改),文档中很少提到类似的内容


我知道在大多数实现中,在这种情况下,两个类型转换的行为相同;我的问题是:C++标准对这些情况有什么说明?如果有什么。

< P> C++定义了C转换语法的语义,即<代码> STATICOSTCAST ,<代码> COSTOSTCAST<<代码>和<代码> RealTytRase。因此,无论您使用何种语法来实现相同的操作,您都可以获得相同的保证。

reinterpret\u cast只能用于特定的转换:

  • 指向(足够大的)整数的指针,反之亦然
  • 函数指针到函数指针
  • 对象指针到对象指针
  • 指向成员的指针指向成员的指针
  • 要引用的左值表达式
加(有条件地)函数指针指向对象指针,反之亦然。在大多数情况下,转换后的值是未指定的,但可以保证转换后的值会返回原始值

特别是,您不能使用
重新解释\u cast
在整数和枚举类型之间进行转换;转换必须使用
static_cast
(或者在将非范围枚举转换为整数类型时隐式转换),这是为足够大的整数类型定义的。唯一可能的问题是,如果库做了一些完全疯狂的事情,比如
return reinterpret\u cast(some\u enum)


C样式转换将执行
静态转换
重新解释转换
,然后根据需要执行
常量转换
;因此,任何由
static\u cast
定义良好的转换也由C样式转换定义良好。

否,
reinterpret\u cast
不等同于C样式转换。C样式强制转换允许丢弃常量volatile(因此它包括
const\u cast
)在
reinterpret\u cast
中不允许。如果源和目标类型之间允许使用
static\u cast
,则它将执行
static\u cast
,其语义不同于
reinterpret\u cast
。如果不允许转换,它将返回到
重新解释\u cast
。最后还有一种情况,C类型转换不能用任何其他类型转换来表示:它忽略访问说明符

一些例子说明了不同之处:

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
}
类b0{int a;};
b1类{int b;};
b2类{int c;};
d类:公共b0、公共b1、b2{};
int main(){
dx;
断言(static_cast(&x)==(b1*)&x);
assert(reinterpret_cast(&x)!=(b1*)&x);//不同的值
assert(reinterpret_cast(&x)!=(b2*)&x);//不同的值,
//无法使用静态\u强制转换完成
常数d*p=&x;
//reinterpret_cast(p);//错误不能丢弃常量
(b0*)p;//C样式可以
}

C来回转换并不总是得到相同的值
(float)((int)3.141)
不会返回
3.141
。您可以使用
static\u cast
在int和enum之间进行转换。@Xymostech我指的是在C样式转换下行为正常的类型。我知道C样式转换在某些情况下会修改值,但对于这些情况,整个问题是毫无意义的。@KerrekSB实际上正如我刚才所了解的,
在int和
enum
之间重新解释\u cast
会导致“无效转换”错误-所以它必须是
静态\u cast
。感谢您提供的信息。还有
常量
,所以您注释掉的错误可以使用它“修复”。不管怎样,我想你误解了我。我的问题不是,如果这些代码可以在一个给定的代码行中交换,但是如果其中一个(C++风格)被转换成另一个类型,则当使用另一个类型转换为原来的类型时,它保证了相同的值(任何代码< >代码> < /代码> C++操作符)。code>reinterpret\u cast
不等同于C cast,也不等同于
static\u cast
const\u cast
。在它们相等的情况下,可以应用反向转换,在其他一些情况下,反向转换甚至是隐式的,但您不能盲目地重新解释我提供的示例(特别是第二个和第三个断言。对于这个问题:我可以不考虑原始的演员阵容吗?答案是不,你不能,如果我知道一些不透明的libX演员阵容中的原始和铸造类型,那么我知道他们使用的是什么类型的演员阵容:C风格以可预测的方式工作,你上面提到的限制了他们的自由使用
\u cast
强制转换,通常只留下一个选项(至少只有一个选项,
可以在指针之间重新解释\u cast
,但通常仅在
静态\u cast
不可能时使用)