Я хочу понять правило поиска имен, уточненных в пространстве имен. Я пытаюсь сделать это на примере:
namespace A
{
int a=::b; //error: ‘::b’ has not been declared
}
int b=6;
Есть цитата, на которую я опираюсь в своих рассуждениях (3.4.3.2/2 N3797):
Для пространства имен X и имени m, квалифицированный набор поиска пространства имен S (X,
m) определяется следующим образом: пусть S (X, m) будет набор всех объявлений
м в х и встроенный набор пространств имен X (7.3.1). Если S (X, m)
не пустой, S (X, m) есть S (X, m); в противном случае S (X, m) является объединением
S (Ni, m) для всех пространств имен Ni, назначенных директивами использования в X и
его встроенное пространство имен.
Позволять X
быть глобальным охватом. У нас есть это S(X,b)={int b=6}
, Это подразумевает, что поиск имени должен быть успешным. Но на самом деле программа плохо сформирована. Могу ли я правильно понять это правило?
b находится в глобальной области видимости, но он должен быть объявлен до того, где вы его используете.
лайк
int b=6;
namespace A
{
int a=::b;
}
(N 3690 Draft)
3.4.1 Unqualified name lookup
4. A name used in global scope, outside of any function, class or user-declared namespace, shall be declared before its use in global scope.