Cppreference 提到了重载std::isnan https://en.cppreference.com/w/cpp/numeric/math/isnan and std::isinf https://en.cppreference.com/w/cpp/numeric/math/isinf(也许还有其他人)整数类型。这使得以下调用明确的:
std::isnan(1);
但是,我找不到 C++ 标准中提到的任何此类重载。我检查了 C++11 和当前草案 http://eel.is/c++draft/cmath.syn#lib:isnan,并且只有重载float
, double
, and long double
.
至于编译器行为,GCC https://godbolt.org/z/oQBjS0 and Clang https://godbolt.org/z/YpX18a都编译代码,但是MSVC 没有 https://godbolt.org/z/qcTfQs。谁是对的? cppreference 上的积分重载从何而来?
标准页末尾有一段cmath http://www.eel.is/c++draft/cmath.syn#2:
对于每组重载函数<cmath>
,除了abs
,应有足够的额外过载以确保:
2. http://www.eel.is/c++draft/cmath.syn#2.2否则,如果与 double 参数对应的任何算术类型实参具有 double 类型或整数类型,则与 double 参数对应的所有算术类型实参将有效地转换为 double。
积分重载是强制性的,否则您会在三个浮点重载之间得到不明确的调用,但如何实现此类重载尚未指定。
请注意,其他函数<cmath>
标头对整数类型具有正确的重载,例如,
std::atan(1)
调用模板化版本double atan<int,void>(int)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)