Почему определение «стандартного макета» POD в C ++ 11 такое, какое оно есть?

Я ищу новое, упрощенное определение 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;};

Я допускаю, что это странная конструкция, но почему Плохо должно быть запрещено, но не Хорошо ?

Наконец, что могло бы пойти не так, если бы данные были у нескольких составляющих классов члены?

41
задан Mankarse 16 December 2012 в 11:25
поделиться