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