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

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

Другие вопросы по тегам