constexpr 中的构建错误
Posted
技术标签:
【中文标题】constexpr 中的构建错误【英文标题】:Building error in constexpr 【发布时间】:2018-07-21 09:02:45 【问题描述】:我在我的应用程序中使用 constexpr,但出现编译错误。
namespace
const int kLength = 1;
const float kPiNumber = 3.14159265;
constexpr float kCircumferenceArc()
return (2*kPiNumber*kLength) / 360;
我得到的错误是:
在常量表达式中不允许读取非 constexpr 变量“kPiNumber” 返回 (2*kPiNumber) / 360;
有人可以帮我解决这个问题吗?
提前致谢
【问题讨论】:
const
带有constexpr
初始化器的整数变量会自动生成constexpr
,但浮点变量不会。解决方案是使kPiNumber
constexpr.
【参考方案1】:
constexpr 变量必须从编译时已知的值初始化。一个 const 变量,例如:
const float kPiNumber = 3.14159265;
由于某些历史原因,'const float' 在编译时是未知的。 要使其工作,您必须将此行更改为:
constexpr float kPiNumber = 3.14159265;
完整代码如下:
namespace
const int kLength = 1;
constexpr float kPiNumber = 3.14159265f;
constexpr float kCircumferenceArc()
return (2*kPiNumber*kLength) / 360;
【讨论】:
"由于某些历史原因,'const float' 在编译时是未知的。" 可以使const
变量具有它们的值,仅在运行时知道. constexpr
明确指出,该值必须在编译时已知。
我覆盖了history of why floating point have exception wrt to constant expression以上是关于constexpr 中的构建错误的主要内容,如果未能解决你的问题,请参考以下文章
GCC 错误 - 在 constexpr 中输入/递减数组访问
if constexpr 在模板化 lambda 中未丢弃的错误分支