结构 C 定义了几个静态常量成员,如下所示:
代码如下:
#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 中通常不允许为 static const
成员提供类内初始化器。对 C++98 中的整型和枚举类型的 static const
对象这样做的可能性是对这些类型的特殊处理的一部分。
constexpr
是 C++11 中引入的新功能。它的设计不同,并且适用于所有类型。
因此,您可以只对整数和浮点类型使用 constexpr
,而忘记任何不均匀性。
如果您继续在此类上下文中使用 const
,您将不得不处理 C++98 遗留问题。但是,C++17 将引入内联变量,这也应该可以为任何类型的inline static const
对象使用类内初始化器。
关于C++ 和 C++11 类静态成员,double 应该使用 "constexpr"而 int 可以是 "const",为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686175/