我们是否仍然需要单独定义静态成员,即使它们是在类定义中初始化的

Do we still need to separately define static members, even if they are initialised inside the class definition?

本文关键字:定义 初始化 是否 我们 静态成员 单独      更新时间:2023-10-16

在 C++03 中,我们能够在类定义中内联初始化const static类数据成员,但如果要使用 odr 来定义成员,我们仍然必须定义该成员。

C++11 仍然如此吗?

struct Foo
{
   static const int x = 3;
};
const int Foo::x;
// ^ required?

是的。

[C++11: 9.4.2/3]: 如果非易失性 const static 数据成员是整型或枚举类型,则其在类定义中的声明可以指定大括号或等于初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式 (5.19(。可以使用constexpr说明符在类定义中声明文本类型的static数据成员;如果是这样,则其声明应指定一个大括号或等于初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式[ 注意:在这两种情况下,成员都可能出现在常量表达式中。—尾注 ]如果在程序中使用 (3.2( 的成员,则仍应在命名空间作用域中定义该成员,并且命名空间作用域定义不应包含初始值设定项

这与 C++03 中的措辞相当:

[C++03: 9.4.2/2]: 如果静态数据成员是整constconst枚举类型,则其在类定义中的声明可以指定一个常量初始值设定项,该初始值设定项应为整型常量表达式 (5.19(。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则仍应在命名空间作用域中定义该成员,并且命名空间作用域定义不应包含初始值设定项

如您所见,规则本身根本没有改变,除了引入constexpr规则之外。