Меня немного смущают последствия [namespace.udir]p2. Рассмотрим следующую программу:
namespace X { int i = 1; }
namespace Y { using namespace X; }
int main() { i = 2; }
В нем поиск имени для i
в main не работает (я пробовал с GCC, Clang и Visual C++). Похоже, это не согласуется с [namespace.udir]p2 (http://eel.is/c++draft/dcl.dcl#namespace.udir-2):
Директива-использования указывает, что имена в назначенном пространстве имен могут использоваться в той области, в которой директива-использования появляется после директивы-использования. Во время поиска неполного имени ([basic.lookup.unqual]) имена отображаются так, как если бы они были объявлены в ближайшем охватывающем пространстве имен, которое содержит как директиву использования, так и назначенное пространство имен. [Примечание: In В данном контексте «содержит» означает «содержит прямо или косвенно». — примечание в конце]
В моей программе я применяю это правило для имени i
, объявленного int i = 1;
в X
, следующим образом:
Директива использования:
using namespace X;
Назначенное пространство имен:
X
Ближайшее окружающее пространство имен: глобальное пространство имен.
Разве это не означает, что неквалифицированный поиск имени i
в main
должен найти X::i
? Почему я не получаю такого результата ни с одним из трех испробованных компиляторов?