I\'m reading the c++14 N3797 and I\'ve encountered with 3.3.7/1:
If reordering member declarations in a class yields an alternate valid program under (1
The "alternate valid program" is referring to a situation in which each ordering of the elements in the class yields a valid interpretation of the program, but the meaning changes depending on the ordering.
In your case, changing the order of a
and b
is allowed, but since their relative order can't affect the meaning of the program, the behavior is defined.
For this to happen, you must use a name in the class that has already been defined with some other meaning outside the class. For example:
typedef void *T;
struct whatever {
T a;
typedef long T;
};
Here, the relative order of the declaration of a
and the typedef of T
affects the meaning of the code. As it's written right now, a
has type void *
, because the global typedef void *T;
is in scope when the T a;
is parsed.
If, however, we rearranged the two so as:
typedef void *T;
struct whatever {
typedef long T;
T a;
};
...the T a;
is equivalent to long a;
. The meaning of the program is different due to the relative ordering of the two declarations, so the behavior is undefined.