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

时间:2013-04-24 11:27:40

标签: c++ c++11 language-lawyer

在C ++ 03中,我们能够在类定义but still had to define the member if it were to be odr-used中内联const static个类数据成员。

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

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

const int Foo::x;
// ^ required?

1 个答案:

答案 0 :(得分:8)

  

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

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

  

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

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