С n3225
, 9,2 [class.mem] note 15
Нестатические члены данных (не объединяющего) класса с одинаковым контролем доступа (раздел 11) распределяются так, чтобы более поздние члены имели более высокие адреса внутри объекта класса. Порядок распределения нестатических элементов данных с различным контролем доступа не определен (11).
Это означает, что с учетом следующего объявления:
class Foo {
public: int a;
private: int b;
public: int c;
private: int d;
};
Стандартом применяются только следующие утверждения:
Foo foo;
assert(&foo.a < &foo.c);
assert(&foo.b < &foo.d);
@ Цитата Наваза может быть интерпретирована как предоставление 4 блоков, которые можно свободно смешивать, но это не так. Объявление Foo
полностью эквивалентно:
class Foo' {
public: int a,c;
private: int b,d;
};
Действительно, компилятор полностью игнорирует (для этой цели), появился ли спецификатор один или несколько раз, и указание его каждый раз является ложным и в лучшем случае замедляет компиляцию из-за дополнительного синтаксического анализа. Для человека-читателя это может быть яснее ... но это очень субъективно.