在将一些代码从VS2013移植到GGC4.9和Clang3.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 )也是如此。因此,我的问题是,这是否是预期的。
标准是否要求像isfinite这样的函数的参数实际上是直接的double或float,而不是隐式地转换给它们呢?
另外,我有点不确定为什么std::is_arithmetic不是std::is_floating_point,is_arithmetic是不是意味着整数上的isfinite?
另一个问题是,指定约束(如is_convertible_to_floating_point )的最佳方法是什么
发布于 2014-12-06 21:37:50
§26.8 c.数学/p10-11:
分类/比较函数的行为与C宏的行为相同,相应的名称在C标准中定义在7.12.3分类宏和7.12.14比较宏中。对于三种浮点类型,每个函数都被重载,如下所示: //其他函数省略bool是有限的(浮x);bool是有限的(双x);bool是有限的(长双x); 此外,还应增加足够的超载,以确保:
long double类型,那么与double参数相对应的所有算术参数都有效地转换为long double。double参数对应的算术参数都具有double类型或整数类型,那么与double参数对应的所有算术参数都有效地转换为double。double参数对应的所有算术参数都具有float类型。我会为libc++设置一个bug。
https://stackoverflow.com/questions/27336479
复制相似问题