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