C和C 11类的静态成员,double应该使用“constexpr”而int可以是“const”,为什么?

结构C定义了几个静态const成员,如下所示:

代码如下:

#include<stdio.h>
struct C{
    static int i;
    static const int j=1;
    static constexpr double d=1;
    static const double d1=1.0;
};
int main(){
    return 0;
}

编译会导致错误:

$g++ testStatic.cpp -std=c++11
testStatic.cpp:6:25: error: in-class initializer for static data member of
      type 'const double' requires 'constexpr' specifier
      [-Wstatic-float-init]
    static const double d1=1.0;
                        ^  ~~~
testStatic.cpp:6:5: note: add 'constexpr'
    static const double d1=1.0;
    ^
    constexpr
1 error generated.

为什么这么奇怪
为什么static int可以是const,double应该是constexpr,什么是理性的

最佳答案 const遵循C 98和C 03中定义的原始语言规范.通常不允许在C 98中为静态const成员提供类内初始化器.对C 98中的整数和枚举类型的静态const对象执行此操作的可能性是这些类型的特殊处理的一部分.

constexpris是C 11中引入的新功能.它的设计不同,适用于所有类型.

因此,您可以将constexpr用于整数和浮点类型,并忘记任何非均匀性.

如果在这种情况下继续使用const,则必须处理C 98遗留问题.但是,C 17将引入内联变量,这也应该可以为任何类型的内联静态const对象使用类内初始化器.

点赞