У меня есть этот пример кода
namespace ns1
{
void foo(int)
{
}
}
namespace ns2
{
void foo()
{
}
void bar()
{
using namespace ::ns1;
foo(42); // why compiler can't just call ns1::foo?
}
}
И он не компилируется с ошибкой:
prog.cpp:16:9: error: too many arguments to function ‘void ns2::foo()’
Я нашел причину этой ошибки в стандарте С++ 2003:
Директива using указывает, что имена в номинированном пространстве имен может использоваться в области, в которой появляется директива use после директива use. При поиске неквалифицированного имени (3.4.1), имена отображаются так, как если бы они были объявлены в ближайшем охватывающем пространстве имен который содержит как директиву, так и назначенное пространство имен.[Примечание: в этом контексте "содержит" означает "содержит непосредственно или косвенно".]
Является ли любое обоснование для этого странного правила? Почему имена из пространства имен ns1 не могут непосредственно отображаться в пространстве имен ns2?