结构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对象使用类内初始化器.