无穷大不是constexpr
Infinity not constexpr
我想测试无穷大附近的浮子的行为。为此,我天真地写了以下代码:
#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
,所以我想知道问题的问题在哪里。
编辑1:
删除了不必要的static_assert
。感谢您指向分区。
和强制性Godbolt链接:https://godbolt.org/g/nd5yf9
编辑2:
请注意,相同的行为适用于:
constexpr float foo = std::numeric_limits<float>::infinity() - 100.0f;
我对浮点规则并不特别熟悉,但我怀疑我们可能会在[expr]/4:
的情况下运行如果在评估表达式期间,该结果在数学上没有定义或不在其类型的代表值范围内,则行为是未定义的。
这又意味着我们在[expr.const]/2.6:
的情况下运行表达式E是核心常数表达式]通过此文档的[CPP]
这意味着foo
的初始化器不是恒定的表达式,因此我们不能用它初始化constexpr
对象。
如果infinity() - epsilon()
针对float
定义明确,则这是一个clang虫,代码已良好。如果float
的定义不明确,则是GCC错误。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 无穷大不是constexpr