4

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

在 C++11 中仍然是这种情况吗?

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

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

1 回答 1

8

是的。

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

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

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

如您所见,除了为constexpr.

于 2013-04-24T11:27:39.937 回答