c++ class

c++ - Regla de reordenar declaración de miembro en clase



class (1)

El "programa válido alternativo" se refiere a una situación en la que cada orden de los elementos de la clase produce una interpretación válida del programa, pero el significado cambia según la ordenación.

En su caso, se permite cambiar el orden de a y b , pero como su orden relativo no puede afectar el significado del programa, se define el comportamiento.

Para que esto suceda, debe usar un nombre en la clase que ya se ha definido con algún otro significado fuera de la clase. Por ejemplo:

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

Aquí, el orden relativo de la declaración de a y el typedef de T afecta el significado del código. Como está escrito en este momento, a tiene el tipo void * , porque el typedef void *T; global typedef void *T; está en alcance cuando la T a; es analizado

Si, sin embargo, reorganizamos los dos para que:

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

... la T a; es equivalente a long a; . El significado del programa es diferente debido al orden relativo de las dos declaraciones, por lo que el comportamiento no está definido.

Estoy leyendo el c ++ 14 N3797 y me he encontrado con 3.3.7 / 1:

Si reordenar las declaraciones de los miembros en una clase produce un programa válido alternativo en (1) y (2), el programa está mal formado, no se requiere ningún diagnóstico.

Hay (1) y (2):

1) El alcance potencial de un nombre declarado en una clase consiste no solo en la región declarativa que sigue al punto de declaración del nombre, sino también en todos los cuerpos de función, los argumentos predeterminados, las especificaciones de excepción y los inicializadores brace o iguales - miembros de datos estáticos en esa clase (incluyendo cosas así en clases anidadas).

2) Un nombre N utilizado en una clase S se referirá a la misma declaración en su contexto y cuando se vuelva a evaluar en el alcance completo de S. No se requiere un diagnóstico para violar esta regla.

Eso es si escribimos lo siguiente:

class A { int a; int b; }

entonces el programa está mal formado. La declaración de miembro de reordenamiento da como resultado un programa válido alternativo:

class A { int b; int a; }

¿No puedo entender esta regla correctamente?