当前位置: 首页 > 知识库问答 >
问题:

用const初始化constexpr:对int和double[duplicate]的不同处理

万俟旭
2023-03-14

以下代码无法在Ideone上实时编译:

#include <iostream>
using namespace std;

int main() {
    const double kPi = 3.14;
    constexpr double kPi2 = 2.0*kPi;
    cout << kPi2;
}

错误消息为:

prog.cpp: In function 'int main()':
prog.cpp:6:30: error: the value of 'kPi' is not usable in a constant expression
  constexpr double kPi2 = 2.0*kPi;
                              ^
prog.cpp:5:15: note: 'kPi' was not declared 'constexpr'
  const double kPi = 3.14;

constexpr替换kpiconst声明,它将成功编译。

另一方面,当使用int而不是double时,似乎constconstexpr配合得很好:

#include <iostream>
using namespace std;

int main() {
    const int k1 = 10;
    constexpr int k2 = 2*k1;
    cout << k2 << '\n';
    return 0;
}

为什么intdouble在用const初始化constexpr时会得到不同的处理?
这是Ideone编译器中的错误吗?这是C++标准所要求的吗?为什么?
上面的代码是UB吗?

附注。我尝试使用Visual Studio2015 C++编译器,它很好地编译了第一个代码段(用const初始化constexpr)。

共有1个答案

马绪
2023-03-14

Shafik Yaghmour已经提供了一个解释背景的链接。

由于我必须维护必须使用不同标准进行编译的代码,所以我使用以下宏:

#if __cplusplus <= 199711L  // lower than C++11
  #define MY_CONST const
#else // C++11 and above
  #define MY_CONST constexpr
#endif
 类似资料:
  • 我有以下代码: 你能解释一下和以下有什么区别吗? 在这种情况下,我们有什么新发现?

  • 有时意味着 在这种情况下,由于运行时速度的提高,用户是否应该总是选择而不是?

  • 问题内容: 如何使用类型初始化变量? 因为我有错误 问题答案: 常量声明不能包含函数调用(某些例外,请参见下文),它们必须在编译时进行评估,而函数调用是在运行时进行的。 引用规格:常量: 常数值由符文,整数,浮点数,虚数或字符串文字表示,标识符表示常数,常数表达式,结果为常数的转换或某些内置结果的值函数,例如应用于任何值,或应用于某些表达式,以及应用于常量,以及应用于数字常量的复数。 并引用Spe

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • 我想使用“=”符号初始化MyClass的对象。 例如。字符串a=“你好”; 我想做 这是我用构造函数写的类

  • 问题内容: 我有一个Bean,其中有一个字段“ CustAmount”,该字段为double,我尝试测试该Bean,但我似乎不明白这一点:当我在本地计算机上运行时,实例化时它将初始化为0.0。当我在linux测试环境中运行相同的代码时,它保持为空。因此,如果我将CustAmount作为null发送到后端,则会得到一些数据,但是如果我将CustAmount作为0.0发送,则查询将在0.0的基础上完成