使命名空间内联时使用 using 指令进行限定名称查找的不同行为
Different behavior for qualified name lookup with using-directive when making namespace inline
我正在学习using-directives,并试图了解using-directives的名称查找规则,但我遇到了这个问题,我找不到任何解释。
问题是这样的:
prog1:命名空间 C
在命名空间 A
之外:
#include <iostream>
namespace C
{
namespace Detail
{
void func()
{
std::cout << "C::Detail::func " << "\n";
}
}
}
namespace A
{
namespace Detail
{
void func()
{
std::cout << "A::Detail::func " << "\n";
}
}
using namespace C;
void func2()
{
Detail::func(); // no conflict, select A::Detail::func
}
}
int main()
{
A::func2();
return 0;
}
程序成功,执行并输出A::Detail::func
.
当我在 namespace A
中移动 namespace C
时,出现编译器错误:
prog2: 命名空间 C
在命名空间 A
:
内
namespace A
{
namespace C
{
namespace Detail
{
void func()
{
std::cout << "C::Detail::func " << "\n";
}
}
}
namespace Detail
{
void func()
{
std::cout << "A::Detail::func " << "\n";
}
}
using namespace C;
void func2()
{
Detail::func(); // conflict for A::Detail::func and A::C::Detail::func
}
}
int main()
{
A::func2();
return 0;
}
程序有这个编译器错误:
prog.cc:27:9: error: reference to 'Detail' is ambiguous
Detail::func();
^
prog.cc:15:15: note: candidate found by name lookup is 'A::Detail'
namespace Detail
^
prog.cc:6:19: note: candidate found by name lookup is 'A::C::Detail'
namespace Detail
^
1 error generated.
编译器:GCC 9.3.0 和 CLANG 9.0.0,结果相同
我的问题:
为什么结果不一样,这种情况下限定名查找的具体规则是什么?
[namespace.udir]/2 A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (6.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace. [ Note: In this context, “contains” means “contains directly or indirectly”. —end note ]
强调我的。在 prog1 中,最近的封闭命名空间是全局命名空间,A::Detail
在 ::Detail
之前找到。在 prog2 中,最近的封闭命名空间是 A
,因此名称查找找到两个不同的命名空间,都命名为 A::Detail
.
我正在学习using-directives,并试图了解using-directives的名称查找规则,但我遇到了这个问题,我找不到任何解释。
问题是这样的:
prog1:命名空间 C
在命名空间 A
之外:
#include <iostream>
namespace C
{
namespace Detail
{
void func()
{
std::cout << "C::Detail::func " << "\n";
}
}
}
namespace A
{
namespace Detail
{
void func()
{
std::cout << "A::Detail::func " << "\n";
}
}
using namespace C;
void func2()
{
Detail::func(); // no conflict, select A::Detail::func
}
}
int main()
{
A::func2();
return 0;
}
程序成功,执行并输出A::Detail::func
.
当我在 namespace A
中移动 namespace C
时,出现编译器错误:
prog2: 命名空间 C
在命名空间 A
:
namespace A
{
namespace C
{
namespace Detail
{
void func()
{
std::cout << "C::Detail::func " << "\n";
}
}
}
namespace Detail
{
void func()
{
std::cout << "A::Detail::func " << "\n";
}
}
using namespace C;
void func2()
{
Detail::func(); // conflict for A::Detail::func and A::C::Detail::func
}
}
int main()
{
A::func2();
return 0;
}
程序有这个编译器错误:
prog.cc:27:9: error: reference to 'Detail' is ambiguous
Detail::func();
^
prog.cc:15:15: note: candidate found by name lookup is 'A::Detail'
namespace Detail
^
prog.cc:6:19: note: candidate found by name lookup is 'A::C::Detail'
namespace Detail
^
1 error generated.
编译器:GCC 9.3.0 和 CLANG 9.0.0,结果相同
我的问题:
为什么结果不一样,这种情况下限定名查找的具体规则是什么?
[namespace.udir]/2 A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (6.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace. [ Note: In this context, “contains” means “contains directly or indirectly”. —end note ]
强调我的。在 prog1 中,最近的封闭命名空间是全局命名空间,A::Detail
在 ::Detail
之前找到。在 prog2 中,最近的封闭命名空间是 A
,因此名称查找找到两个不同的命名空间,都命名为 A::Detail
.