18

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.

4

2 回答 2

23

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

为除或complex以外的任何类型float实例化模板的效果是未指定的。doublelong double

换句话说,编译器可以在您实例化complex<int>. 从语言的角度来看,您在这里得到 0 的事实是完全明确定义的行为。

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

希望这可以帮助!

于 2012-06-19T20:11:58.807 回答
6

在 MinGW 4.6.2 上打印200.

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

为除或complex以外的任何类型float实例化模板的效果是未指定的。doublelong double

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

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

于 2012-06-19T20:13:01.217 回答