c++ static-members scoping

c++ - Prueba de inicialización de variables estáticas



static-members scoping (1)

[basic.lookup.qual] / 3

En una declaración en la que el ID de declarador es un ID calificado, los nombres utilizados antes del ID calificado se declaran en el ámbito del espacio de nombres de definición; los nombres que siguen al id. calificado se buscan en el ámbito de la clase o espacio de nombres del miembro.

En

int C::j = i + 1;

el identificador-id, es decir, el nombre de la entidad que se está declarando, es C::j , que es un id-calificado . Por lo tanto, la i siguiente se busca en el alcance de C y se refiere a C::i .

Menos técnicamente, cuando se define un miembro de datos estáticos, se puede pensar que el inicializador está en el alcance de la clase y encontrará miembros de clase antes que los globales.

Esta es la misma regla que garantiza que cuando una función miembro se define fuera de línea, los nombres después del nombre de la función se buscarán en el alcance de la clase y no requerirán una calificación explícita si se refieren a los miembros de la clase. Es más inusual ver que esto se aplica a las definiciones de miembros de datos estáticos, pero es perfectamente consistente.

#include <stdio.h> class C { public: static int i; static int j; }; int i = 10; int C::i = 20; int C::j = i + 1; int main () { printf("%d", C::j); return 0; }

¿Cuál es el valor de: C :: j

Estaba leyendo un cuestionario de c ++ y encontré la siguiente pregunta. Pensé que la respuesta es 11 .

int C::j = i + 1;

¿Ya que está accediendo a la i no estática que es 10? Entonces, ¿pensé que 11 debería ser la respuesta?

Compilé y ejecuté este código a través de Visual Studio e imprime 21 . Lo que me confunde. ¿Puede alguien explicar por qué esto está sucediendo? ¿Qué me estoy perdiendo?