命名空间成员可以在包含声明的命名空间中定义:
命名空间的成员也可以通过显式限定(3.4.3.2)定义的名称来定义在该命名空间之外,前提是要定义的实体已经在命名空间中声明, 并且定义出现在声明点所在的命名空间的内部。
void f();
namespace N { void ::f() {} } // illegal for definition
namespace N { void ::f(); } // what about redeclaration?
可以在封装声明的命名空间中定义类:
如果类头名称包含嵌套名称限定符,则类说明符应该引用先前在该嵌套名称限定符所引用的类或命名空间中直接声明的类,或在该命名空间的内联名称空间集合(即不是仅通过using声明继承或引入),并且类说明符应该出现在封装先前声明的命名空间的命名空间中。在这种情况下,定义的类头名称的嵌套名称限定符不应以decltype说明符开头。
struct A;
namespace N { struct ::A {}; } // illegal for definition
namespace N { struct ::A; } // what about redeclaration?
我们对成员函数定义和静态数据成员定义有相同的规定。
所以我的问题是,重新声明(而不是定义)在不包含原始声明的命名空间中是否合法?