Я пытаюсь понять, что означает следующая цитата (3.4.3 / 3 N3797):
имена после квалифицированного идентификатора ищутся в области действия
класс члена или пространство имен.
namespace A
{
class C
{
public:
static const int a=7;
static int b;
};
}
int A::C::b=a; //7
Сфера действия static int b;
состоять только декларативного региона, следующего за b
Точка декларации. На самом деле:
Потенциальная область действия имени, объявленного в классе, состоит не только из
декларативный регион после пункта названия, но
также всех тел функций, аргументы по умолчанию,
спецификации исключений и инициализаторы фигурных или равных скобок
нестатические члены данных в этом классе
Это подразумевает, что static const int a=7;
не относится к сфере static int b;
, Следовательно static const int a=7
не может быть найден в int A::C::b=a;
,
Это опечатка в Стандарте или это мое недоразумение?
Это означает, что static const int a = 7; не относится к сфере
статического int b ;. Следовательно, статическое const int a = 7 не может быть найдено в
int A :: C :: b = a ;.
Нет. Это подразумевает именно то, что вы можете прочитать там: потенциальная область действия имени, объявленного в классе также содержит тела функций и т. д. нестатических элементов данных. Это не противоречит приведенной выше цитате: декларативная область (и область действия) статического члена данных по-прежнему содержит область действия класса, который он был объявлен сам по себе.
Вы сами цитировали соответствующую часть:
имена после квалифицированного идентификатора ищутся в области действия
класс члена или пространство имен
Следовательно, поскольку в этом фрагменте кода
int A::C::b=a;
a
используется после идентификатора объявления, он ищется в классе и находит.
Цитата говорит «сфера членского учебный класс«, а не» область действия члена «; a
ищется в объеме класса C
, Там можно найти, объявлено ли это после b
,
Указанное вами правило (пункт 1 из 3.3.7p1) предназначено для имен, используемых в классе:
namespace A
{
class C
{
public:
int b = a;
static const int a=7;
};
}
Правило, которое разрешает код, который вы перечислили, является пунктом 5 того же абзаца:
5) Потенциальная область объявления, которая распространяется до или после окончания определения класса, также распространяется на регионы, определенные его определениями членов, даже если члены определены лексически вне класса […]
Очевидно, что есть некоторые совпадения между пунктами 1 и 5 применимости 3.3.7p1, но это не имеет значения, поскольку они имеют тот же эффект, что и перекрытие.
3.4.3p3 говорит то же, что и пункт 3.3.7p1, только с другой формулировкой; поясняет, что тип, появляющийся перед Квалифицированный-идентификатор не является частьюрегион, определенный с помощью определения члена».