变量上的 const 与 constexpr
这家伙关于 constexpr 的说法是正确的if double
被使用(或float
当然)。但是,如果您将 var 类型更改为double
对于像 int、char 等整数类型,一切正常。为什么会发生这种情况?
http://ideone.com/DAWABE
int main()
{
const int PI1 = 3;
constexpr int PI2 = 3;
constexpr int PI3 = PI1; // works
static_assert(PI1 == 3, ""); // works
const double PI1__ = 3.0;
constexpr double PI2__ = 3.0;
constexpr double PI3__ = PI1__; // error
static_assert(PI1__ == 3.0, ""); // error
return 0;
}
Update
: 下面这行是一个错误,我的意思是PI3__ = PI1__
constexpr double PI3__ = PI1; // I meant PI1__
问题:
Why const int = 3
是编译时间常数,但是const double = 3.0
不是?
我有什么理由应该使用constexpr const int val;
over constexpr int val
?他们俩似乎做的完全一样。
根据您在评论中的回答,这就是我的答案。 C++ 标准已经说得很清楚了。不过 GCC 5.1 在这里工作得很好:https://godbolt.org/g/2oV6Hk
T 类型的转换常量表达式是隐式转换为 T 类型的表达式,其中转换的
表达式是常量表达式,隐式转换序列仅包含
§ 5.20 134
c ISO/IEC N4567
[...]
(4.6) — 积分促销 (4.5),
(4.7) — 除收缩转换 (8.5.4) 之外的积分转换 (4.7),
[...]
有关 n4567 中缩小转换 (8.5.4/7) 的参考:
缩小转换是隐式转换
- 从浮点类型到整数类型,或者
- 从 long double 到 double 或 float,或者从 double 到 float,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使无法精确表示),或者
- 从整数类型或无作用域枚举类型到浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并且在转换回原始类型时将产生原始值,或者
- 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,并且转换后的实际值将适合目标类型并在以下情况下产生原始值:转换回原始类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)