将某些代码从VS2013移植到GGC 4.9和Clang 3.5(使用libc++)时,我只是遇到了编译失败。代码的要点是

#include <cmath>

struct Foo
{
    operator double() const { return( 101.0 ); } // Implicit conversion to double
};

int main( int, char** )
{
    Foo foo;

    std::exp( foo );      // Compiles
    std::isfinite( foo ); // Does not

    return( 0 );
}

我相信isfinite调用不会编译,因为cmath中的isfinite函数具有声明为的返回类型:
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type

并且因为Foo不是is_arithmetic,所以isfinite从重载集中删除。像isfinite这样的isnan friend 也是如此。所以我的问题是这是否可以预期。

标准是否要求像isfinite这样的函数的参数实际上直接是doublefloat,而不是隐式可转换为它们的参数?

我也有点不确定为什么std::is_arithmetic不是std::is_floating_pointis_arithmetic不暗示整数上的isfinite吗?

另外一个问题是,指定像is_convertible_to_floating_point这样的约束的最佳方法是什么?

最佳答案

§26.8[c.math]/p10-11:



我会针对libc++提交错误。

关于c++ - SFINAE std::isfinite和使用std::is_arithmetic的相似函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27336479/

10-12 05:32