【问题标题】:Overloads of std::isnan and std::isinf for integral types整数类型的 std::isnan 和 std::isinf 重载
【发布时间】:2019-10-14 21:16:36
【问题描述】:

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

std::isnan(1);

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

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

【问题讨论】:

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


    【解决方案1】:

    标准页末尾有一段cmath

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

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

    整数重载是强制性的,否则您会在三个浮点重载之间得到模棱两可的调用,但未指定如何实现此类重载。


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

    std::atan(1)
    

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

    【讨论】:

      【解决方案2】:

      这是概要,还有footnote

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

      ...

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

      对应bool isnan( IntegralType arg )描述

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

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多