将某些代码从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
这样的函数的参数实际上直接是double
或float
,而不是隐式可转换为它们的参数?我也有点不确定为什么
std::is_arithmetic
不是std::is_floating_point
,is_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/