Cppreference提到了整数类型的std::isnan
和std::isinf
(可能还有其他)的重载。这使得以下调用明确:
std::isnan(1);
但是,我找不到C ++标准中提到的任何此类重载。我检查了C ++ 11和current draft,只有float
,double
和long double
的重载。
对于编译器行为,GCC和Clang都编译代码,但是MSVC does not。谁是对的? cppreference的积分重载从何而来?
答案 0 :(得分:7)
标准页面末尾有一个cmath段落:
对于
<cmath>
中的每组重载函数,除了abs
之外,还应该有足够的重载来确保:2.否则,如果与double参数对应的任何算术类型参数具有double类型或整数类型,则与double参数对应的所有算术类型参数将有效地转换为double。
整数重载是强制性的,否则您将在三个浮点重载之间得到模棱两可的调用,但是未说明如何实现这种重载。
请注意,<cmath>
标头中的其他函数对于整数类型(例如,
std::atan(1)
调用模板版本double atan<int,void>(int)
。
答案 1 :(得分:5)
这是一个简介,其中有一个footnote
对于abs中的每组重载函数,除abs之外,都应有足够的额外重载来确保:
...
- 否则,如果与double参数对应的算术类型的任何参数具有double类型或整数类型,则与double参数对应的所有算术类型的参数都将有效地转换为double。
与bool isnan( IntegralType arg )
描述相对应
一组重载或接受任何整数类型arg参数的函数模板。等效于(2)(参数强制转换为double)。