首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用std::is_arithmetic实现的是有限函数和相似函数

利用std::is_arithmetic实现的是有限函数和相似函数
EN

Stack Overflow用户
提问于 2014-12-06 21:02:08
回答 1查看 561关注 0票数 5

在将一些代码从VS2013移植到GGC4.9和Clang3.5(使用libc++ )时,我遇到了编译失败。代码的要点是

代码语言:javascript
复制
#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函数的返回类型声明为:

代码语言:javascript
复制
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type

而且,由于Foo不是is_arithmetic,所以isfinite将从重载集中删除。isfinite的朋友(如isnan )也是如此。因此,我的问题是,这是否是预期的。

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

另外,我有点不确定为什么std::is_arithmetic不是std::is_floating_pointis_arithmetic是不是意味着整数上的isfinite

另一个问题是,指定约束(如is_convertible_to_floating_point )的最佳方法是什么

EN

回答 1

Stack Overflow用户

发布于 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); 此外,还应增加足够的超载,以确保:

  1. 如果任何与双参数对应的算术参数都具有long double类型,那么与double参数相对应的所有算术参数都有效地转换为long double
  2. 否则,如果任何与double参数对应的算术参数都具有double类型或整数类型,那么与double参数对应的所有算术参数都有效地转换为double
  3. 否则,与double参数对应的所有算术参数都具有float类型。

我会为libc++设置一个bug。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27336479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档