Поиск имени сопровождается квалифицированным идентификатором объявления

Я пытаюсь понять, что означает следующая цитата (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;,

Это опечатка в Стандарте или это мое недоразумение?

2

Решение

Это означает, что static const int a = 7; не относится к сфере
статического int b ;. Следовательно, статическое const int a = 7 не может быть найдено в
int A :: C :: b = a ;.

Нет. Это подразумевает именно то, что вы можете прочитать там: потенциальная область действия имени, объявленного в классе также содержит тела функций и т. д. нестатических элементов данных. Это не противоречит приведенной выше цитате: декларативная область (и область действия) статического члена данных по-прежнему содержит область действия класса, который он был объявлен сам по себе.

Вы сами цитировали соответствующую часть:

имена после квалифицированного идентификатора ищутся в области действия
класс члена или пространство имен

Следовательно, поскольку в этом фрагменте кода

int A::C::b=a;

a используется после идентификатора объявления, он ищется в классе и находит.

2

Другие решения

Цитата говорит «сфера членского учебный класс«, а не» область действия члена «; a ищется в объеме класса C, Там можно найти, объявлено ли это после b,

0

Указанное вами правило (пункт 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, только с другой формулировкой; поясняет, что тип, появляющийся перед Квалифицированный-идентификатор не является частьюрегион, определенный с помощью определения члена».

0
По вопросам рекламы [email protected]