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

Lig*_*ica 4 c++ language-lawyer c++11

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

在C++ 11中仍然如此吗?

struct Foo
{
   static const int x = 3;
};

const int Foo::x;
// ^ required?
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 8

是.

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

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

[C++03: 9.4.2/2]:如果静态数据成员是const整数或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19).在这种情况下,成员可以出现在整数常量表达式中.如果在程序中使用该成员,并且名称空间范围定义不包含初始化程序,则该成员仍应在名称空间作用域中定义.

正如您所看到的,除了引入规则之外,规则本身并没有发生任何变化constexpr.