Правила поиска имени для спецификатора вложенного имени
Я прочитал следующее (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), поэтому оно ищется в соответствии с правилами для квалифицированного имени.