Поиск имени следует после квалифицированного declarator-id

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

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


person Community    schedule 04.06.2014    source источник
comment
(Возможная) область действия имени b — это не то же самое, что область видимости класса, связанная с C.   -  person aschepler    schedule 04.06.2014
comment
Похоже, вы что-то недопонимаете. Две цитаты объясняют разные вещи.   -  person jrok    schedule 04.06.2014


Ответы (3)


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

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

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

имена, следующие за квалифицированным идентификатором, ищутся в области класса члена или пространстве имен

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

int A::C::b=a;

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

person Columbo    schedule 04.06.2014

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

person Mike Seymour    schedule 04.06.2014

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

person ecatmur    schedule 04.06.2014