在命名空间范围之外定义命名空间的变量成员

Wak*_*zil 0 c++ language-lawyer c++11

在C++标准中,它是否说在命名空间范围之外定义命名空间的变量成员的方法是通过extern在变量成员的声明中使用说明符?

§3.4.1/ 14提到这个"en passant":

如果命名空间的变量成员在其命名空间的范围之外定义,则会查找成员定义中出现的任何名称(在declarator-id之后),就好像成员的定义出现在其名称空间中一样.[例如:

namespace N {
int i = 4;
extern int j;
}
int i = 2;
int N::j = i; // N::j == 4
Run Code Online (Sandbox Code Playgroud)

Igo*_*nik 5

3.1/2声明是一个定义,除非......它包含说明extern符(7.1.1)......

extern与命名空间无关 - 它只是一种使变量声明不是一个定义的方法.然后,您可以自由选择在命名空间内部或外部提供单独的定义.