为什么abs(complex <int>)总是返回零?</int>

时间:2012-06-19 20:08:39

标签: c++ math stl std complex-numbers

VS2010的以下代码打印0,与我的期望相反:

#include <complex>
#include <iostream>

using namespace std;

int main(void)
{
    complex<int> z(20, 200);
    cout << abs<int>(z) << endl;
    return 0;
}

当类型为double时,它可以正常工作。

2 个答案:

答案 0 :(得分:23)

根据C ++ ISO规范,§26.2/ 2:

  

未指定complexfloatdouble以外的任何类型实例化模板long double的效果。

换句话说,编译器可以在实例化complex<int>时执行任何操作。从语言的角度来看,你在这里获得0的事实是非常明确的行为。

为了进行比较 - 在​​ideone's version of gcc上,此代码甚至无法编译。这是另一个完全有效的选择。

希望这有帮助!

答案 1 :(得分:6)

在MinGW 4.6.2上,它打印200

但是,在C ++ ISO标准第26.2.2节中:

  

未指定complexfloatdouble以外的任何类型实例化模板long double的效果。

因此,您的构建环境显示complex<int>的未定义行为,这与标准不符。

正如templatetypedef指出的那样,ideone's C99 compiler(GCC 4.3.4)拒绝完全编译它。