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

Why does abs(complex<int>) always return zero?

本文关键字:返回 int abs complex lt 为什么 gt      更新时间:2023-10-16

以下带有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时,它工作正常。

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

实例

化模板的效果complexfloatdoublelong double 以外的任何类型都是未指定的。

换句话说,当您实例化complex<int>时,编译器可以做任何它想做的事情。 从语言的角度来看,你在这里得到 0 的事实完全是定义良好的行为。

为了进行比较 - 在 ideone 的 gcc 版本上,这段代码甚至无法编译。 这是另一个完全有效的选择。

希望这有帮助!

在 MinGW 4.6.2 上,它打印200 .

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

实例

化模板的效果complexfloatdoublelong double 以外的任何类型都是未指定的。

因此,您的构建环境表现出未定义的行为 complex<int> ,这并不违反标准。

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