为什么std::isnan不是constexpr?

10

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

这是否有技术上的原因?

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


1
也许最初没有将其制作为constexpr,因为检查NaN通常需要使用禁止在常量表达式中使用的拼接和位操作。但是另一方面,编译器允许在需要时“神奇地”使东西成为constexpr。所以,我只能猜测。 - StoryTeller - Unslander Monica
2
或许我们会在C++23中得到它。请参阅:http://open-std.org/JTC1/SC22/WG21/docs/papers/2019/p0533r5.pdf - AndyG
现在可能是std::fpclassify中的某些东西禁止它吗? - Ted Lyngmo
3
x!=x 是你的好朋友。 - Davis Herring
NoSesseEtAll:你得到的答案难道没有回答你的问题吗? - Ted Lyngmo
1个回答

8
答案基本上是“因为该提案尚未合并到标准中”。 P0533 提出了你所要求的内容,但它未被列入 C++20 中。
其中一个问题是,也许这个提案有点大......在 <cmath><cstdlib> 中的一些函数被允许设置全局错误代码,这使得整个“constexpr 所有东西”的提议变得复杂起来。* 我认为这些分类函数不应该有任何问题; std::isnan 和其姊妹函数 std::fpclassify 都定义为与 C 宏 isnanfpclassify 表现相同。这将需要稍作更改。
*(附注:p2043“不要把所有东西都用 constexpr修饰”在这里有些相关,但它只是在谈论元编程。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接