Я изучаю новое, расслабленное определение POD в С++ 11 (раздел 9.7)
Класс стандартного макета - это класс, который:
- не имеет нестатических членов данных типа нестандартного макета класса (или массива таких типов) или ссылки,
- не имеет виртуальных функций (10.3) и нет виртуальных базовых классов (10.1),
- имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,
- не имеет базовых классов нестандартной компоновки,
- либо не содержит нестатических членов данных в самом производном классе, а не более одного базового класса с нестатическими элементами данных или не имеет базовых классов с нестатическими членами данных и
- не имеет базовых классов того же типа, что и первый нестатический член данных.
Я выделил биты, которые меня удивили.
Что пойдет не так, если мы допустим данные с различными контрольными элементами доступа?
Что пойдет не так, если первый член данных также был базовым классом? то есть.
struct Foo {};
struct Good : Foo {int x; Foo y;};
struct Bad : Foo {Foo y; int x;};
Я признаю это странной конструкцией, но почему Bad
запрещено, но не Good
?
Наконец, что пошло бы неправильно, если бы у более чем одного составного класса были члены данных?