2015-01-27 3 views
0

Меня интересует формальный 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; } 

DEMO

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; } 

DEMO

Правило, которое я предоставил, не имеет ничего общего с концепцией декларации, но на самом деле мы можем видеть, что это так. Таким образом, стандарт неявно предполагает, что точка объявления m должна быть до точки, где используется имя. Я думаю, что это должно быть указано явно. Может быть, я потерял предложение, где было указано ... если да, не могли бы вы указать мне на это?

ответ

2

Из [basic.scope.namespace] (§3.3.6/1), курсив:

Имя элемента пространства имен имеет область пространства имен. Его потенциал сфера включает в себя пространство имен из точки имени о декларации (3.3.2) и далее

a можно найти только в namespace Aпосле она объявлена. Таким образом, пример (1) недействителен, поскольку a еще не объявлен, а пример (2) действителен, поскольку он был.