[namespace.udir] говорит (выделено мое):
-2- using-директива указывает, что имена в номинированном пространстве имен могут использоваться в области действияв котором директива использования появляется после директивы использования . Во время поиска безоговорочного имени (6.4.1) имена появляются так, как если бы они были объявлены в ближайшем окружающем пространстве имен, которое содержит как using-директиву , так и номинированное пространство имен. [Примечание: В этом контексте «содержит» означает «содержит прямо или косвенно». - примечание к концу]
В вашем примере "имена в номинированном пространстве имен" просто foo::sub
, потому что это единственное имя, объявленное в пространстве имен foo
, и "Ближайшее окружающее пространство имен, которое содержит директиву using и назначенное пространство имен ", является глобальным пространством имен.Таким образом, foo::sub
выглядит (для целей поиска по имени), как если бы оно было в глобальном пространстве имен, например:
namespace sub {
int f();
} // namespace sub
namespace bar {
namespace sub {
int g() {
return sub::f() + 1;
}
} // namespace sub
} // namespace bar
Теперь должно быть более очевидно, что sub::f
ничего не найдет.Поиск имени для sub::f
начинается с поиска sub
.Он не находит его в окружающем пространстве имен (которое bar::sub
), поэтому он смотрит в следующую внутреннюю включающую область (который bar
) и там находит sub
.В этот момент поиск имени для sub
останавливается, он не ищет в глобальном пространстве имен, где он обнаружил бы foo::sub
, видимый директивой using .
Следующий шаг поиска имени пытается найти f
в области, которую он нашел для sub
, но в найденном им пространстве имен f
нет, поэтому поиск по имени не удался.
* 1045Директивы using не работают как добавление объявления использования для каждого члена пространства имен, они "более слабые", чем объявления использования.Причина этого заключается в том, что имена, действительно объявленные в пространстве имен, имеют приоритет над именами, которые просто становятся видимыми с помощью директивы using.
ответ Родриго на связанный вопрос объясняет это более подробно.