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

时间:2019-05-29 09:40:23

标签: c++ c++11 language-lawyer

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

std::isnan(1);

但是,我找不到C ++标准中提到的任何此类重载。我检查了C ++ 11和current draft,只有floatdoublelong double的重载。

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

2 个答案:

答案 0 :(得分:7)

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

  

对于<cmath>中的每组重载函数,除了abs之外,还应该有足够的重载来确保:

     

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

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


请注意,<cmath>标头中的其他函数对于整数类型(例如,

)具有正确的重载
std::atan(1)

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

答案 1 :(得分:5)

这是一个简介,其中有一个footnote

  

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

     

...

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

bool isnan( IntegralType arg )描述相对应

  

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