Я прочитал следующее (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 будет выглядеть как полное имя внутри пространства имен? То есть мы можем определить правила для вложенное имя спецификатор искать индуктивно. Но я не могу найти ничего подобного в стандарте. Это правда вообще?
Да, это индуктивно, и я бы сказал, что это просто следует из формулировки. Во-первых, давайте добавим полную скобку на основе ассоциативности ::
:
(std::cout) << ((A::B)::j)
(Приведенное выше просто для демонстрации того, как синтаксический анализатор понимает приоритет, это не допустимый код).
Так j
квалифицируется по имени A::B
, Это квалифицированное имя, поэтому оно было найдено в соответствии с 3.4.3.
A::B
само по себе является квалифицированным именем (оно соответствует синтаксической форме, изложенной в 5.1.1 / 8), поэтому оно ищется в соответствии с правилами для квалифицированного имени.