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

Art*_*ium 18 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;
}
Run Code Online (Sandbox Code Playgroud)

它的类型是正常的double.

tem*_*def 23

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

将模板实例化为complexfloat(double或未long double指定)之外的任何类型的效果.

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

为了比较 - 在ideone的gcc版本上,这段代码甚至都没有编译.这是另一个完全有效的选择.

希望这可以帮助!


Uns*_*ned 6

在MinGW 4.6.2上打印200.

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

将模板实例化为complexfloat(double或未long double指定)之外的任何类型的效果.

因此,您的构建环境表现出未定义的行为complex<int>,这与标准不符.

正如所templatetypedef指出的,ideone的C99编译器(GCC 4.3.4)拒绝完全编译它.