Dan*_*ica 4 c++ language-lawyer c++11
Cppreference提到了std::isnan和std::isinf(可能还有其他)整数类型的重载。这使得以下调用变得明确:
std::isnan(1);
Run Code Online (Sandbox Code Playgroud)
但是,我找不到C ++标准中提到的任何此类重载。我查了一下C ++ 11和目前的草案,而且只对过载float,double和long double。
至于编译器的行为,GCC和Clang都可以编译代码,但是MSVC不会。谁是对的?cppreference的积分重载从何而来?
在cmath的标准页面末尾有一个段落:
对于中的每个重载函数集,
<cmath>除了之外abs,都应有足够的额外重载来确保:2.否则,如果与double参数相对应的算术类型的任何参数具有double类型或整数类型,则将与double参数相对应的所有算术类型的参数有效地转换为double。
整数重载是强制性的,否则您将在三个浮点重载之间得到模棱两可的调用,但是未说明如何实现这种重载。
请注意,<cmath>标头中的其他函数对于整数类型具有正确的重载,例如,
std::atan(1)
Run Code Online (Sandbox Code Playgroud)
调用模板化版本double atan<int,void>(int)。
这是一个提要,有一个脚注
对于ab中的每组重载函数,除了abs之外,都应有足够的额外重载来确保:
...
- 否则,如果对应于double参数的算术类型的任何参数具有double类型或整数类型,则将与double参数对应的所有算术类型的参数有效地转换为double。
与bool isnan( IntegralType arg )描述相对应
一组重载或接受任何整数类型arg参数的函数模板。等效于(2)(参数强制转换为double)。
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |