使用using-directive进行不明确的名称查找

Col*_*mbo 8 c++ qualified-name language-lawyer name-lookup

不允许将名称空间和具有相同名称的类放入一个声明性区域,即

namespace A {}
class A{};
Run Code Online (Sandbox Code Playgroud)

形成不良(见§3.3.1/ 4).但是,可以通过using-directive引入任一个的名称:

namespace N { namespace A {int i;} }

struct A {static int i;};

using namespace N;

int i = A::i; // The global struct, or namespace N::A?
Run Code Online (Sandbox Code Playgroud)

这段代码是不正确的吗?VC++ 和Clang一样认为:

main.cpp:7:9: error: reference to 'A' is ambiguous
int i = A::i;
        ^
main.cpp:3:8: note: candidate found by name lookup is 'A'
struct A {static int i;};
       ^
main.cpp:1:25: note: candidate found by name lookup is 'N::A'
namespace N { namespace A {int i;} }
                        ^
Run Code Online (Sandbox Code Playgroud)

但是,GCC接受了它.

谁是对的?

Col*_*mbo 7

代码格式不正确.查找时A,§7.3.4/ 6步骤:

如果名称查找在两个不同的名称空间中找到名称的声明,并且声明不声明相同的实体并且不声明函数,则名称的使用是错误的.

这里,名称空间是全局名称空间N,而实体是名称空间N::A和类::A.