【发布时间】:2017-09-22 20:17:44
【问题描述】:
我想测试接近无穷大的浮点数的行为。 为此,我天真地写了以下代码:
#include <limits>
#include <iostream>
int main() {
constexpr float foo = std::numeric_limits<float>::infinity() - std::numeric_limits<float>::epsilon();
std::cout << foo << std::endl;
return foo;
}
对我来说有趣的是,这在 GCC 7.2 中编译得很好,但在 Clang 5 中编译失败(抱怨 foo 的非 constexpr 分配)。
AFAIK,因为 C++11、std::numeric_limits<float>::infinity() 和 infinity() 是 constexpr,所以我想知道 Clang 的问题出在哪里。
编辑 1:
删除了不必要的static_assert。
感谢您指出除以 0。IMO 引用的标准文本不适用于此处!?
还有必填的神螺栓链接:https://godbolt.org/g/Nd5yF9
编辑 2:
请注意,同样的行为适用于:
constexpr float foo = std::numeric_limits<float>::infinity() - 100.0f;
【问题讨论】:
-
发布 exact 错误消息将是一个很好的第一步..
-
请注意 gcc 上的 does not compile。
static_assert失败。 Visual C++ 类似 -
另请注意,clang 的问题在于
-;这有效:godbolt.org/g/ZyUgJw -
@abergmeier 进一步阅读后,我不认为这是重复的,但肯定是相关的。