класс. Если он пуст и есть базовый класс того же типа, то адрес базового объекта и адрес первого члена данных могут быть равны, что недопустимо.
трю на новое, смягченное определение 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;};
Я признаю, что это странная конструкция, но почемуBad
быть запрещено, но неGood
?
Наконец, что может пойти не так, если более чем в одном составляющем классе есть члены-данные?