不允许将名称空间和具有相同名称的类放入一个声明区域,即
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。
谁是对的?
答案 0 :(得分:6)
代码格式不正确。查找A
时,§7.3.4/ 6步骤:
如果名称查找找到两个不同的名称声明 名称空间,并且声明不会声明相同的实体 没有声明功能,名称的使用是不正确的。
此处,命名空间是全局命名空间和N
,实体是命名空间N::A
和类::A
。