c++ - 在 constexpr 变量模板中模拟 nan/inf

标签 c++ c++11 c++14 constexpr variable-templates

有没有办法在常量表达式中模拟 nan/inf 而没有!使用 C 宏 HUGE_VAL 和 INFINITY 或任何其他的!另外,即使有了它们,它仍然不是 constexpr。

我不想使用 C++ 标准库或 C 标准库提供的任何标准函数。

当然下面的不编译。编译器说 constexpr 变量必须用常量表达式初始化...

template<typename T = double>
constexpr T NaN = T(0.0 / 0.0);

MSVC编译器使用的方法也不编译:

template<typename T = double>
constexpr T NaN = T(1e+300); //with some changes, apparently having the float overflow

我知道这有点笼统,但这是针对图书馆的,我正在寻找一些有根据的建议!谢谢!

最佳答案

__builtin_nan("0")

我使用 compiler explorer 检查了这个它似乎在 gcc 6.1+、clang 6.0.0+、MSVC v19.24+ 和许多其他不常见的编译器中也受支持。

使用编译器提供的。这是唯一的非标准方式。检查您的编译器是否以及如何提供此功能。还要记住标准库提供 std::numeric_limits<T>::has_quiet_NaN 这是有原因的。

关于c++ - 在 constexpr 变量模板中模拟 nan/inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549529/

相关文章:

c++ - 具有 map 索引的不同地址与 map 索引的内容

c++ - 为什么具有类内初始化程序的局部结构隐藏类的变量?

c++ - 尝试将 std::vector<std::pair<T, U>> 转换为其左值 ref 时收到 VS 编译器警告 C4239

c++11 - std::chrono::system_clock::time_point 的值可以根据时区更改吗?

c++ - 了解 SFINAE 示例

c++ - 如何在 C++ 中为多个类创建别名

c++ - 类型之间的转换

c++ - vector 中的结构成员是否在 C++ 中初始化为零?

c++ - fatal error LNK1104 : cannot open file 'gdi32.lib'

c++ - std::bind 与 lambda 性能