Согласно С++ 11 9.1/7 (проект n3376), класс стандартного макета - это класс, который:
не содержит нестатических элементов данных класса нестандартного макета (или массива таких типов) или ссылки,
не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1),
имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,
не имеет базовых классов нестандартной компоновки,
либо не имеет нестатических членов данных в самом производном классе и не более одного базового класса с нестатическими членами данных, либо не имеет базовых классов с нестатическими членами данных, а
не имеет базовых классов того же типа, что и первый нестатический элемент данных.
следует, что пустой класс является классом стандартного макета; и что другой класс с пустым классом в качестве базы также является классом стандартного макета, если первый нестатический член данных такого класса не имеет того же типа, что и база.
Кроме того, в 9.2/19 говорится, что:
Указатель на объект структуры стандартного макета, соответствующим образом преобразованный с помощью
reinterpret_cast
, указывает на его начальный член (или если этот элемент является битовым полем, а затем в единицу, в которой он находится) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. -end note]
Это, по-видимому, означает, что Оптимизация пустого базового класса теперь является обязательной оптимизацией, по крайней мере для классов стандартного макета. Я хочу сказать, что если пустая оптимизация базы данных не предусмотрена, то макет класса стандартного макета не будет стандартным, а зависит от того, реализует ли реализация или не упомянула оптимизацию. Правильно ли я рассуждаю, или я что-то пропустил?