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 中输入/递减数组访问

对静态 constexpr 数据成员的未定义引用错误

if constexpr 在模板化 lambda 中未丢弃的错误分支

解读C++ constexpr关键字的特性

在另一个函数中前向声明“constexpr”函数——编译器错误?

与 MSVC 链接错误,但与 constexpr 的 g++ 无关