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

Я прочитал следующее (3.4.3/1):

Если оператору разрешения:: scope в спецификаторе вложенного имени не предшествует спецификатор decltype, поиск имени, предшествующего этому::, рассматривает только пространства имен, типы и шаблоны, специализации которых являются типами.

Каково правило поиска для спецификатора вложенного имени?

Например:

#include <iostrem>

namespace A
{
    int j=5;
}

int main()
{
    std::cout << A::j //I assume that A will be searched as just *unqualified-name* appeared inside the function which is a member of namespace
}

Второй пример:

namespace A
{
    namespace B
    {
        int j=5;
    }
}

int main()
{
    std::cout << A::B::j
}

Правда ли, что во втором примере A::B будет выглядеть как полное имя внутри пространства имен? Т.е. мы можем определить правила для поиска по вложенным именам-спецификаторам индуктивно. Но я не могу найти ничего подобного в стандарте. Это правда вообще?

1 ответ

Да, это индуктивно, и я бы сказал, что это просто следует из формулировки. Во-первых, давайте добавим круглые скобки на основе ассоциативности :::

(std::cout) << ((A::B)::j)

(Приведенное выше просто для демонстрации того, как синтаксический анализатор понимает приоритет, это не допустимый код).

Так j квалифицируется по имени A::B, Это квалифицированное имя, поэтому оно было найдено в соответствии с 3.4.3.

A::B само по себе является квалифицированным именем (оно соответствует синтаксической форме, изложенной в 5.1.1/8), поэтому оно ищется в соответствии с правилами для квалифицированного имени.

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