【问题标题】:constexpr math functions in C++20 [duplicate]C ++ 20中的constexpr数学函数[重复]
【发布时间】:2020-08-04 14:48:49
【问题描述】:

我正在尝试做类似的事情:

#include <cmath>

template <unsigned A, unsigned B>
struct fu {
    constexpr unsigned long power_A_of_B = std::pow(A, B);
};

但是编译器会报错,因为pow() 不是constexpr

为什么标题 &lt;cmath&gt; 中的数学函数不是 constexpr? 例如,log()log2()pow()abs()fmax() 不是constexpr,但&lt;algorithm&gt; 中的其他人是,例如max()min() 和`clamp()' .

【问题讨论】:

  • 你可以自己做
  • std::is_constant_evaluated 自己做 :)
  • 答案不是一些深层的技术原因,只是“委员会只是人类,他们还没有达到它”。不确定these proposals 的当前状态。
  • 可能重复:Constexpr Math Functions。简而言之,许多cmath 函数设置errno,这是一个副作用,因此是非constexpr。

标签: c++ templates constexpr c++20


【解决方案1】:

为什么标头中的数学函数不是 constexpr?

原因很好地隐藏在std::pow的文档中:

std::pow, std::powf, std::powl - cppreference.com

错误处理

按照 math_errhandling 中的规定报告错误。

查看math_errhandling的文档。

现在如何在constexpr 中处理这个宏?

所以整个问题是保持与旧规范的兼容性。

唯一可能的解决方案是使用替代实现。我找到了something like this,没有对其进行测试,但看起来很有希望。找到here

【讨论】:

  • 干扰器。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多