【问题标题】:Why is std::isnan not constexpr?为什么 std::isnan 不是 constexpr?
【发布时间】:2020-10-30 04:37:54
【问题描述】:

从 C++20 开始,std::isnan 不是 constexpr。

这有技术原因吗?

我能想到的只是它在“C 标头”中,所以没有人费心去修复它(<limits> 处理浮点数的函数是 constexpr,但不幸的是 numeric_limits 不包含 isnan 检查)。

【问题讨论】:

  • 也许它最初不是 constexpr 因为检查 NaN 通常需要在常量表达式中不允许的那种双关语和位旋转。但是话又说回来,编译器可以在需要时“神奇地”制作 constexpr 的东西。所以,我只能猜测。
  • open-std.org/JTC1/SC22/WG21/docs/papers/2019/p0533r5.pdf 也许我们会在 C++23 中得到它
  • 会不会是 std::fpclassify 中的某些东西现在禁止它?
  • x!=x 是你的朋友。
  • NoSesseEtAll:你得到的答案没有回答你的问题吗?

标签: c++ constexpr c++20


【解决方案1】:

答案基本上是“因为提案还没有被合并到标准中”

P0533 提出你的要求,但它没有进入 C++20。

其中一个问题是,也许这个提议有点大……<cmath><cstdlib> 中的某些功能允许设置全局错误代码,这会使整个“constexpr”所有事情变得复杂" 提案*

我认为这些分类功能应该没有问题; std::isnan 及其兄弟std::fpclassify 被定义为分别与C 宏isnanfpclassify 行为相同。这需要稍微改变一下。


*(除了:p2043“不要constexpr all the things”在这里是切题相关的,但它只是在谈论元编程)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 2016-03-15
    • 2015-10-19
    • 2017-11-11
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多