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

标签 c++ c++11 static double constants

结构 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/

相关文章:

c++ - 如果有特定元素,则控制 vector

c++ - 如何使用 boost.python 导出复杂类

c++ - 如何在 cmd c++ boost::asio 中通过网络在两台或多台计算机之间传输一个字符串?

c++ - boost 序列化 std::unique_ptr 支持

c++ - 本地类模板

c++ - 有没有更简单的方法让键盘输入返回字符(SFML)?

c++ - 如何将 A<B<T>>* 解释为 A<C<T>>* 其中 B : public C<T>?

c# - 使用静态方法寻找关于线程安全的建议到 'process' 类实例

java - 如何避免在单例模式中使用 volatile 的性能开销?

ios - 静态 UITableView 的更新部分