Правило переупорядочения декларации участника в классе

Я читаю С++ 14 N3797, и я столкнулся с 3.3.7/1:

Если переупорядочение объявлений-членов в классе дает альтернативный действительный программа согласно (1) и (2), программа плохо сформирована, диагностика отсутствует требуется.

Существуют (1) и (2):

1) Потенциальная область имени, объявленного в классе, состоит не только из декларативного региона, следующего за точкой названия декларации, но и всех тел функций, аргументов по умолчанию, исключение-спецификации и скобки-равные-инициализаторы нестатические данные в этом классе (включая такие вещи во вложенных классы).

2) Имя N, используемое в классе S, должно ссылаться на одно и то же объявление в его контекст и при повторной оценке в завершенном объеме С. Нет для нарушения этого правила требуется диагностика.

То есть, если мы напишем следующее:

class A
{
    int a;
    int b;
}

то программа плохо сформирована. Объявление реорганизации члена дает альтернативную действующую программу:

class A
{
    int b;
    int a;
}

Могу ли я правильно понять это правило?

Ответ 1

"Альтернативная действительная программа" относится к ситуации, когда каждый порядок элементов в классе дает правильную интерпретацию программы, но значение меняет в зависимости от упорядочения.

В вашем случае разрешается изменение порядка a и b, но поскольку их относительный порядок не может повлиять на значение программы, определяется поведение.

Чтобы это произошло, вы должны использовать имя в классе, который уже был определен с каким-либо другим значением вне класса. Например:

typedef void *T;

struct whatever {
    T a;
    typedef long T;
};

Здесь относительный порядок объявления a и typedef T влияет на значение кода. Как было написано прямо сейчас, a имеет тип void *, потому что глобальный typedef void *T; находится в области видимости при анализе T a;.

Если, однако, мы перестроили два так:

typedef void *T;

struct whatever {
    typedef long T;
    T a;
};

... T a; эквивалентен long a;. Значение программы отличается из-за относительного упорядочения двух объявлений, поэтому поведение undefined.