Это в основном совместимость с C ++ 03 и C:
- тот же контроль доступа - в реализациях C ++ 03 разрешено использовать спецификаторы контроля доступа как возможность переупорядочить (группы) членов класса, например, чтобы упаковать его лучше.
- более одного класса в иерархии с нестатическими членами данных - C ++ 03 не говорит, где расположены базовые классы или дополняется ли заполнение в подобъектах базового класса, которые будут присутствовать в законченном объекте того же типа.
- базовый класс и первый член того же типа - из-за второго правила, если тип базового класса используется для члена данных, тогда он должен быть пустым классом. Многие компиляторы реализуют пустую оптимизацию базового класса, поэтому то, что Андреас говорит о подобъектах с одинаковым адресом, было бы правдой. Я не уверен, хотя то, что это о классах стандартной компоновки, означает, что для подобъекта базового класса плохо иметь тот же адрес, что и у первого члена данных того же типа, но не имеет значения, когда подобъект базового класса имеет тот же адрес, что и у первого элемента данных другого типа. [Правка: это потому, что разные объекты одного типа имеют разные адреса, даже если они являются пустыми подобъектами. Благодаря Йоханнесу]
C ++ 0x, вероятно, мог бы определить, что эти вещи также являются типами стандартной компоновки, и в этом случае он также определит, как они расположены, в той же степени, что и для стандартных. Типы макетов. Далее в ответ Йоханнеса. Посмотрите на его пример замечательного свойства классов стандартной компоновки, которому мешают эти вещи.
Но если бы это было так, то некоторые реализации были бы вынуждены изменить то, как они планируют классы, чтобы соответствовать новым требованиям, что является помехой для структурной совместимости между различными версиями этого компилятора до и после C ++. 0x. В основном это нарушает C ++ ABI.
Мое понимание того, как была определена стандартная компоновка, заключается в том, что они смотрели на то, какие требования POD можно было ослабить, не нарушая существующие реализации. Поэтому я предполагаю, не проверяя, что выше приведены примеры, когда некоторые существующие реализации C ++ 03 действительно используют не-POD-природу класса, чтобы сделать что-то, что несовместимо со стандартной компоновкой.