整型的std :: isnan和std :: isinf重载

Dan*_*ica 4 c++ language-lawyer c++11

Cppreference提到了std::isnanstd::isinf(可能还有其他)整数类型的重载。这使得以下调用变得明确

std::isnan(1);
Run Code Online (Sandbox Code Playgroud)

但是,我找不到C ++标准中提到的任何此类重载。我查了一下C ++ 11和目前的草案,而且只对过载floatdoublelong double

至于编译器的行为,GCCClang都可以编译代码,但是MSVC不会。谁是对的?cppreference的积分重载从何而来?

Hol*_*olt 7

cmath的标准页面末尾有一个段落:

对于中的每个重载函数集,<cmath>除了之外abs,都应有足够的额外重载来确保:

2.否则,如果与double参数相对应的算术类型的任何参数具有double类型或整数类型,则将与double参数相对应的所有算术类型的参数有效地转换为double。

整数重载是强制性的,否则您将在三个浮点重载之间得到模棱两可的调用,但是未说明如何实现这种重载。


请注意,<cmath>标头中的其他函数对于整数类型具有正确的重载,例如,

std::atan(1)
Run Code Online (Sandbox Code Playgroud)

调用模板化版本double atan<int,void>(int)


Use*_*ess 5

这是一个提要,有一个脚注

对于ab中的每组重载函数,除了abs之外,都应有足够的额外重载来确保:

...

  1. 否则,如果对应于double参数的算术类型的任何参数具有double类型或整数类型,则将与double参数对应的所有算术类型的参数有效地转换为double。

bool isnan( IntegralType arg )描述相对应

一组重载或接受任何整数类型arg参数的函数模板。等效于(2)(参数强制转换为double)。