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
的组合来检查该部分。