以下代码无法在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
替换kpi
的const
声明,它将成功编译。
另一方面,当使用int
而不是double
时,似乎const
与constexpr
配合得很好:
#include <iostream>
using namespace std;
int main() {
const int k1 = 10;
constexpr int k2 = 2*k1;
cout << k2 << '\n';
return 0;
}
为什么int
和double
在用const
初始化constexpr
时会得到不同的处理?
这是Ideone编译器中的错误吗?这是C++标准所要求的吗?为什么?
上面的代码是UB吗?
附注。我尝试使用Visual Studio2015 C++编译器,它很好地编译了第一个代码段(用const
初始化constexpr
)。
Shafik Yaghmour已经提供了一个解释背景的链接。
由于我必须维护必须使用不同标准进行编译的代码,所以我使用以下宏:
#if __cplusplus <= 199711L // lower than C++11
#define MY_CONST const
#else // C++11 and above
#define MY_CONST constexpr
#endif
我有以下代码: 你能解释一下和以下有什么区别吗? 在这种情况下,我们有什么新发现?
有时意味着 在这种情况下,由于运行时速度的提高,用户是否应该总是选择而不是?
问题内容: 如何使用类型初始化变量? 因为我有错误 问题答案: 常量声明不能包含函数调用(某些例外,请参见下文),它们必须在编译时进行评估,而函数调用是在运行时进行的。 引用规格:常量: 常数值由符文,整数,浮点数,虚数或字符串文字表示,标识符表示常数,常数表达式,结果为常数的转换或某些内置结果的值函数,例如应用于任何值,或应用于某些表达式,以及应用于常量,以及应用于数字常量的复数。 并引用Spe
我想使用“=”符号初始化MyClass的对象。 例如。字符串a=“你好”; 我想做 这是我用构造函数写的类
此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。
问题内容: 我有一个Bean,其中有一个字段“ CustAmount”,该字段为double,我尝试测试该Bean,但我似乎不明白这一点:当我在本地计算机上运行时,实例化时它将初始化为0.0。当我在linux测试环境中运行相同的代码时,它保持为空。因此,如果我将CustAmount作为null发送到后端,则会得到一些数据,但是如果我将CustAmount作为0.0发送,则查询将在0.0的基础上完成