Меня интересует формальный couplig между point of declaration
и концепциями name-lookup
. В частности, когда nested-name-specifier
обозначается пространство имен, неквалифицированный поиск имени производить набор декларации следующим образом: N4296::3.4.3.2 [namespace.qual]
Поиск по названию и концепции декларации
Для имен
X
и имениm
, пространство имен квалифицированного поиска набораS(X,m)
определяется следующим образом: ПустьS0(X,m)
- это набор всех объявленийm
вX
и встроенное пространство именX
(7.3.1). ЕслиS0(X,m)
не является пустым,S(X,m)
являетсяS0(X,m)
; в противном случаеS(X,m)
является объединениемS(Ni,m)
для всех пространств именNi
, номинированных с использованием-директивами вX
и его встроенным пространством имен.
Позвольте мне привести пару примеров:
1.
#include <iostream>
namespace A
{
int b = 42;
}
int a = A::a; //Error
namespace A
{
int a = 24;
}
int main(){ std::cout << a << std::endl; }
2.
#include <iostream>
namespace A
{
int b = 42;
}
namespace A
{
int a = 24;
}
int a = A::a; //OK
int main(){ std::cout << a << std::endl; }
Правило, которое я предоставил, не имеет ничего общего с концепцией декларации, но на самом деле мы можем видеть, что это так. Таким образом, стандарт неявно предполагает, что точка объявления m
должна быть до точки, где используется имя. Я думаю, что это должно быть указано явно. Может быть, я потерял предложение, где было указано ... если да, не могли бы вы указать мне на это?