在 C++03 中,我们只允许为枚举类型的 const 积分的静态成员变量提供类内初始化器,在 C++11 中,我们可以使用 constexpr 在类中初始化字面量类型的静态成员。这个限制保留在 C++11 中用于 const 变量,主要是为了兼容 C++03 我们可以从已关闭的问题 1826 中看到这一点:常量表达式中的 const floating-point 说:
用常量初始化的 const 整数可以在常量表达式中使用,但用常量初始化的 const 浮点变量不能。这是有意为之,与 C++03 兼容,同时鼓励一致使用 constexpr。然而,有些人发现这种区别令人惊讶。
CWG 最终将此请求视为非缺陷(NAD)关闭,基本上是说:
希望浮点值参与常量表达式的程序员应该使用 constexpr 而不是 const。
作为参考,在[class.static.data]N1804
部分中公开的最接近 C++03 的标准草案说:9.4.2
如果静态数据成员是 const 整数或 const 枚举类型,它在类定义中的声明可以指定一个常量初始化器,它应该是一个整数常量表达式 (5.19)。在这种情况下,成员可以出现在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在名称空间范围内定义,并且名称空间范围定义不应包含初始值设定项。
和草案 C++11 标准部分9.4.2
[class.static.data]说:
如果非易失性 const 静态数据成员是整数或枚举类型,则其在类定义中的声明可以指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式 (5.19) . 可以在类定义中使用 constexpr 说明符声明文字类型的静态数据成员;如果是这样,它的声明应指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式。[...]
这在 C++14 标准草案中几乎相同。