这基本上是my prior question的延续。
这是C++14中的class/7:
标准布局类是这样一个类:
考虑以下片段:
struct B{ int i; };
struct A : B{ int j; };A通过(7.4)满足项目点(7.1),但不满足(7.5),因为A有一个非静态数据成员,并且有一个带有非静态数据成员的基类。
A作为一个标准布局类有什么问题?
编辑
就我所能理解的accepted answer而言,如果我试图将指向基类B和back的第一个数据成员的指针转换为B和back基类的第一个数据成员,那么上面的片段就会有未定义的行为,因为这句话由OP编写:
Within a class, members are allocated in increasing addresses according to the declaration order. However C++ doesn't dictate the order of allocation for data members across classes.
但这似乎没有回答我的问题。例如,假设在某个编译器实现中,基本B将在内存中跟随struct A,而不是在其前面。但是,这与这样一个事实相矛盾,即从指针到派生类,到指向基类的指针,都有一个隐式转换,根据class . But /3:
类型“指针到cv”的prvalue (其中D是类类型)可以转换为类型“指针到cv”的prvalue,其中B是D的基类(第10条)。
也就是说,如果基本B在内存中遵循struct A,则上述隐式转换将无效。
发布于 2016-10-08 11:09:44
直接回答问题的措辞如下:
这个项目的目的是允许非常简单的继承情况,其中只有一个类有数据成员。
继承的数据布局未指定,因此标准可能完全不允许继承,但如果一个类没有数据来将结果作为标准布局来处理,则标准会出现异常。
https://stackoverflow.com/questions/39924012
复制相似问题