怎么做A
和s::A
区别?
最大的不同是声明ofA
也是定义,而声明ofs::A
不是。我不确定您所说的“特殊规则”是什么意思,但static
在每种情况下都有不同的含义。
在命名空间范围内,它为其提供内部链接,以便对象在当前翻译单元之外不可见。请注意,static
这里是多余的,因为默认情况下命名空间范围内的常量变量具有内部链接。
在类范围内,这意味着有一个独立于类的任何实例的对象。
什么时候它们的用法将被它们的字面值替换?
由于两者都是在声明中带有初始化器的整数常量,因此两者都可以在常量表达式中使用,并且编译器能够用编译时常量替换它们的值。
也许更合适的问题是,什么时候需要定义?
在 C++11 中,如果变量是odr-used ,则它是必需的- 粗略地说,如果您执行任何需要变量地址而不是其值的事情。
在 C++03 中,我认为如果完全使用该变量是必需的,尽管不需要诊断,而且如果您只使用它的值,许多编译器也不会抱怨。不过我可能是错的;旧规则相当复杂,我很高兴现在能够忘记它们。
我什么时候可以取到它的地址?
这要求变量在 C++03 和 C++11 中都有定义。该定义为变量分配存储空间,使其具有地址。
当我需要单独定义它们时?
命名空间范围内的变量声明也是一个定义,除非您声明它extern
;所以你的第一个变量不需要单独的定义。
类范围的变量声明不是定义;所以你的第二个变量确实需要在 C++03 和 C++11 中单独定义,如果它是odr-used。