C++ 何时可以重新解释一对<;A、 B:C>;作为一对<;A、 B>;:C

C++ 何时可以重新解释一对<;A、 B:C>;作为一对<;A、 B>;:C,c++,derived-class,reinterpret-cast,C++,Derived Class,Reinterpret Cast,(除了第一个和第二个有不同的含义之外,这个问题可以被抑制。) 这与我的工作有关。假设我有以下课程 struct object { /* some data */ }; // sizeof(object) ==multiple of 16 struct more_data { /* some other data */ }; // sizeof(more_data)==multiple of 16 struct extended_object : object, more

(除了第一个和第二个有不同的含义之外,这个问题可以被抑制。)

这与我的工作有关。假设我有以下课程

struct object { /* some data */ };           // sizeof(object)   ==multiple of 16
struct more_data { /* some other data */ };  // sizeof(more_data)==multiple of 16
struct extended_object : object, more_data {};

struct named_object : private std::pair<std::string,object>
{
  std::string const&name() const { return first; }
  operator object const&() const { return second; }
};

struct named_extended_object : private std::pair<std::string,extended_object>
{
  std::string const&name() const { return first; }
  operator object const&() const { return second; }
  operator more_data const&() const { return second; }
}
struct extended_named_object : named_object, more_data {};
struct对象{/*一些数据*/};//sizeof(对象)=16的倍数
struct more_data{/*其他一些数据*/};//sizeof(更多数据)=16的倍数
结构扩展_对象:对象,更多_数据{};
名为_对象的结构:private std::pair
{
std::string const&name()const{return first;}
运算符对象常量&()常量{return second;}
};
名为\u扩展\u对象的结构:private std::pair
{
std::string const&name()const{return first;}
运算符对象常量&()常量{return second;}
运算符more_data const&()const{return second;}
}
结构扩展_命名_对象:命名_对象,更多_数据{};
然后,
named_extended_object
extended_named_object
是相似的。事实上,它们的数据布局应该是相同的。[在编辑中添加]通过将
std::pair
基设置为私有,我避免了暴露
first
second
方法,这两种方法确实会返回完全不同的内容

在他们之间重新解释演员阵容是否安全?我如何在编译时(使用
静态断言(这里是什么?
)确定它是什么


注意对象和更多数据的对齐都是8。

否,
命名对象
扩展命名对象
完全不同。如果您获得
命名的\u扩展的\u对象的
第二个
成员
您将获得一个
扩展的\u对象
,而在
扩展的\u命名的\u对象
上,您将获得一个
对象
extended\u named\u object
本身具有
more\u data
结构,而
named\u extended\u object
类没有这种结构。例如:让更多的\u数据比任何其他使用过的类型具有更严格的对齐方式。@JoachimPileborg你是对的,但这只是因为我的问题太简单了。我修正了我的问题来解决这个问题。我在
reinterpret\u cast
的定义中看不到任何东西可以保证这种情况下的安全性。(有点奇怪,我甚至找不到保证
struct a{int;};struct B{int;};
将导致一个有效的
重新解释的关系。当然,这在实践中可能会起作用,并且可以使用
sizeof
alignof
的组合来检查该部分。