【问题标题】:Why doesn't the C++ standard library provide constexpr versions of the cmath functions?为什么 C++ 标准库不提供 cmath 函数的 constexpr 版本?
【发布时间】:2017-02-12 15:06:59
【问题描述】:

自 C++11 以来,我们就有 constexpr 函数,并且随着每个新标准 (14, 1z) 的出现,它们的限制越来越少。

然而,STL 中最明显的函数,可以制作为 constexprcmath/math.h 函数,在任何标准库实现 AFAIK 中仍然没有 constexpr 版本。

这只是 C++ 标准的积压,还是有任何其他原因导致我们仍然没有这些函数的 constexpr 版本?

【问题讨论】:

  • 我不适合 math 标签在这里,至少根据标签维基。我建议你删除它。
  • @Danra:我已经尝试实现一些功能sincos,...作为constexpr,虽然这并非不可能,但至少使用c确实构成了一个很大的挑战++11。问题的很大一部分是很难保证他们可以用来生成函数的constexpr 版本的算法与运行时版本具有相同的质量。这甚至没有考虑到错误处理的需要......
  • 我不同意这个问题被关闭。 “这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。” - 实际上,事实和参考资料主要是我要寻找的,而不是意见。
  • 投票重新开放。 “C++ 标准的积压”不仅存在,而且也是公​​开的。他们是否同样引用<cmath> 功能的constexpr 版本是事实,而不是意见。如果您个人不熟悉 ISO 标准化流程,请不要关闭它。

标签: c++ c++11 constexpr c++-standard-library


【解决方案1】:

它还没有标准化。最初的proposal 刚刚在上周提交,但仅涵盖效用和线性运算,而不包括任何超越函数。数学很难,浮点数学很复杂。例如,constexpr 中的实现不允许溢出到无穷大,但这还没有明确的标准化。

编译器的 constexpr 解释器必须对数学库接口进行特殊处理,因为与标准库的其余部分不同,它看不到其实现。

GCC 确实提供了对数学函数的持续评估作为非一致性扩展。

【讨论】:

  • 请注意,constexpr 并不能保证编译时成功。常量数学可以在溢出或errno 时退出,这正是 GCC 所做的。
  • @Danra 否。标准库的constexpr 部分在标头中有它们的实现。这就是使数学成为特例的原因。 (在 GCC 中,它已经是一个特例,在他们的 C 常量折叠引擎中实现并用于 C++ constexpr。)
  • “甚至不建议标准化”是no longer true
  • 提案中提到 Clang 实际上还通过其内置函数支持 constexpr 数学函数。例如我特别感兴趣的pow 函数实现为constexpr-ish __builtin_pow
  • @Danra Here you go。线程中的第一个帖子很好,但后来被转移了……C'est la vie。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多