const
static
在 C++03 中,我们能够在类定义中内联初始化类数据成员,但如果要使用odr-used仍然必须定义该成员 。
在 C++11 中仍然是这种情况吗?
struct Foo
{
static const int x = 3;
};
const int Foo::x;
// ^ required?
[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
.