在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?
答案 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
规则之外,规则本身并没有发生任何变化。