Поиск имени сопровождается квалифицированным идентификатором объявления
Я пытаюсь понять, что означает следующая цитата (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;
,
Это опечатка в Стандарте или это мое недоразумение?
3 ответа
Это означает, что static const int a=7; не относится к области действия static 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, только с другой формулировкой; в нем поясняется, что тип, появляющийся перед квалифицированным идентификатором, не является частью "региона, определенного в определении [] члена".