在[class] / 7中,C ++ 14中的项目符号(7.5)的目的是什么?

时间:2016-10-07 18:49:01

标签: c++ c++14 language-lawyer

这基本上是my prior question的延续。

这是C ++ 14中的[class] / 7:

标准布局类是一个类:

  • (7.1) - 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • (7.2) - 没有虚函数(10.3),没有虚基类(10.1),
  • (7.3) - 对所有非静态数据成员具有相同的访问控制(第11条),
  • (7.4) - 没有非标准布局基类,
  • (7.5) - 在派生类最多的类中没有非静态数据成员,并且最多只有一个基类 非静态数据成员,或者没有包含非静态数据成员的基类,
  • (7.6) - 没有与第一个非静态数据成员相同类型的基类。

请考虑以下代码段:

struct B{ int i; };
struct A : B{ int j; };

A满足要点(7.1)至(7.4),但不满足(7.5),因为A具有非静态数据成员并且具有基类非静态数据成员。

A作为标准布局类有什么问题?

修改

据我所知accepted answer这个被认为是欺骗的问题,如果我试图将指针A投射到基类B的第一个数据成员,然后返回,因为这个句子是由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,而不是在它之前。但根据[conv.ptr] / 3,这会与从指向派生类的指针到指向基类的指针进行隐式转换相矛盾:

  

类型为“指向cv D的指针”的prvalue,其中D是类类型,可以是   转换为“指向cv B指针”类型的prvalue,其中B是基数   D级(第10条)。

也就是说,如果基座B在内存中跟struct A,则上述隐式转换将无效。

1 个答案:

答案 0 :(得分:0)

直接回答问题:

本项目的目的是允许非常简单的继承案例,其中只有一个的类具有数据成员。

继承的数据布局未指定,因此标准可以完全禁止继承,但如果一个类具有 no 数据来将结果视为标准布局,则标准会出现异常。