Квалифицированный поиск имени в имени
Я хочу понять правило поиска имен, уточненных в пространстве имен. Я пытаюсь сделать это на примере:
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) будет набором всех объявлений m в X и встроенным набором пространства имен X (7.3.1). Если S (X, m) не пусто, то S (X, m) есть S (X, m); в противном случае S (X, m) является объединением S(Ni, m) для всех пространств имен Ni, назначенных с помощью директив using в X и его встроенном наборе пространств имен.
Позволять X
быть глобальным охватом. У нас есть это S(X,b)={int b=6}
, Это подразумевает, что поиск имени должен быть успешным. Но на самом деле программа плохо сформирована. Могу ли я правильно понять это правило?
1 ответ
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.