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

Я прочитал следующее (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 будет выглядеть как полное имя внутри пространства имен? То есть мы можем определить правила для вложенное имя спецификатор искать индуктивно. Но я не могу найти ничего подобного в стандарте. Это правда вообще?

2

Решение

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

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

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

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

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

1

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


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