6 Basic concepts [basic]

6.3 Scope [basic.scope]

6.3.7 Class scope [basic.scope.class]

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

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

Имя, объявленное в функции-члене, скрывает объявление с тем же именем, область действия которого простирается до конца класса функции-члена или за его пределами.

Потенциальная область действия объявления, которая простирается до конца определения класса или за его пределами, также распространяется на области, определенные определениями его членов, даже если члены определены лексически вне класса (это включает определения статических элементов данных, определения вложенных классов, и определения функций-членов, включая тело функции-члена и любую часть декларативной части таких определений, которая следует за declarator-id, включая a parameter-declaration-clauseи any default arguments).

[Example:

typedef int  c;
enum { i = 1 };

class X {
  char  v[i];                       // error: i refers to ​::​i but when reevaluated is X​::​i
  int  f() { return sizeof(c); }    // OK: X​::​c
  char  c;
  enum { i = 2 };
};

typedef char*  T;
struct Y {
  T  a;                             // error: T refers to ​::​T but when reevaluated is Y​::​T
  typedef long  T;
  T  b;
};

typedef int I;
class D {
  typedef I I;                      // error, even though no reordering involved
};

end example]

Имя члена класса должно использоваться только следующим образом:

  • в рамках своего класса (как описано выше) или класса derived из своего класса,

  • после . применения оператора к выражению типа его класса ([expr.ref]) или класса, производного от его класса,

  • после -> применения оператора к указателю на объект его класса ([expr.ref]) или класса, производного от его класса,

  • после того, как ​::​ оператор разрешения области видимости ([expr.prim]) применен к имени его класса или класса, производного от его класса.