我有一个类,其中包含static const
成员,我正在类声明内部初始化:
#include <iostream>
class Foo
{
public:
static const int i = 9;
static const float f = 2.9999;
};
int main()
{
std::cout << Foo::i << std::endl;
std::cout << Foo::f << std::endl;
return 0;
}
使用GCC 4.8.2编译选项--std=c++11
进行编译时,会出现以下错误:
foo.cpp:7:32: error: ‘constexpr’ needed for in-class initialization of static data member ‘const float Foo::f’ of non-integral type [-fpermissive]
static const float f = 2.9999;
^
正如消息所示,如果将行更改为
static constexpr float f = 2.9999;
,错误就会消失。为什么类内部浮点变量的静态常量初始化与整数变量有所不同?它们不都只是某个大小(字节数)的值(像宏一样)被复制或使用指针引用吗?
在 SO 上类似问题的早期答案表明,这是因为浮点表达式可能在编译机器和执行机器之间产生不同的结果(假设交叉编译场景)。
然而:
上述代码直接赋值,无需执行计算值的算术操作
对于整数表达式,由于下溢和上溢的结果在不同的架构之间没有明确定义,因此可能会有不同的结果。
最后,
constexpr
在这里做了什么神奇的事情,const
没有做到的呢? 为什么语言不能在使用const
时自动执行constexpr
的操作呢?我的意思是,当以下语句作为 C++ 代码在类外部工作正常时,为什么还需要另一个关键字:const int i = 9; const float f = 2.9999;
static const float f = 2.9999f
吗? - barak manos