在 C++ 中将对象转换为不相关对象的正确方法是什么

Dan*_*Dan 0 c++

#include <iostream>

class c1{
};

class c2{
};

int main(){
 c1 a;
 c2 b;
 //b = static_cast<c2>(a);   <-- will not compile
 
b = *reinterpret_cast<c2*>(&a);
  
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

b = static_cast<c2>(a); 不会编译出现此错误:

no matching conversion for static_cast from 'c1' to 'c2'
Run Code Online (Sandbox Code Playgroud)

使用reinterpret_cast和做 abit cast是实现这一目标的唯一方法吗?

for*_*818 5

正确的方法是提供一种将一种转换为另一种的方法。有不同的方法可以做到这一点,这是一种方法:

struct c2;
struct c1{
    explicit operator c2 ();
};

struct c2{ };

c1::operator c2() { return {};}

int main(){
 c1 a;
 c2 b;
 b = static_cast<c2>(a);
  
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你坚持“无关”...

在 C++ 中将对象转换为不相关对象的正确方法是什么

空无一人。

reinterpret_cast是使编译器静音的好方法,但它b = *reinterpret_cast<c2*>(&a);是未定义的行为。人们通常reinterpret_cast认为它是一个神奇的任意对任意类型的演员,但事实并非如此。有关定义的案例的相当有限的列表,请参见此处。不相关类型的对象之间的转换不在列表中。

  • @Dan是的,您只需将“c1*”类型的*指针*转换为“c2*”类型的*指针*。这是明确定义的。未定义的是“访问”“c1”对象*就好像*它是一个不相关的“c2”对象,这就是当您取消引用强制转换的指针并将结果分配给“b”时发生的情况。请参阅[什么是类型双关以及它的目的是什么?如果我使用它或不使用它会发生什么?](/sf/ask/3089620971/) 和 [什么是严格的别名规则]( /sf/ask/6905531/) (3认同)