为什么在类中初始化的非整数静态数据成员必须是constexpr?

Kno*_*abe 20 c++ static-members constexpr c++11

在类定义中初始化静态整型数据成员可以声明constconstexpr,但在类定义中初始化非整数的静态数据成员必须是constexpr:

class MyClass {
  static const     int   w = 5;          // okay
  static constexpr int   x = 5;          // okay
  static const     float y = 1.5;        // error!
  static constexpr float z = 1.5;        // okay
};
Run Code Online (Sandbox Code Playgroud)

有人知道为什么不允许y的声明吗?标准中将其定为非法的部分是9.4.2/3,但为什么它是非法的?

Zac*_*and 7

在 C++11 之前,您无法在类声明中初始化非整型/枚举类型的静态成员(但可以在类声明之外)。管理规则constexpr继承了这一点,但允许您在类声明中使用它来初始化它constexpr(因此您不再需要如下代码):

struct A
{
    static const float pi;
};

const float A::pi = 3.1415;
Run Code Online (Sandbox Code Playgroud)

该规则的副作用之一是简化类结构而不是使其变得丑陋(如上面的代码)。

在 C++11 添加之前出现这种情况的原因之一constexpr是标准没有指定如何实现浮点(它留给处理器/架构 - 例如,当你说 时float x = 1.6f,它实际上是1.6000000000024在大多数系统上)。