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

时间:2015-04-26 21:48:15

标签: c++ language-lawyer name-lookup qualified-name

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

namespace A {}
class A{};

is ill-formed(见§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?

此代码是否格式错误? VC ++ thinks so,以及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;} }
                        ^

然而,GCC accepts it

谁是对的?

1 个答案:

答案 0 :(得分:6)

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

  

如果名称查找找到两个不同的名称声明   名称空间,并且声明不会声明相同的实体   没有声明功能,名称的使用是不正确的。

此处,命名空间是全局命名空间和N,实体是命名空间N::A和类::A