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
.
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
.
根据 C++ ISO 规范,§26.2/2:
为除或
complex
以外的任何类型float
实例化模板的效果是未指定的。double
long double
换句话说,编译器可以在您实例化complex<int>
. 从语言的角度来看,您在这里得到 0 的事实是完全明确定义的行为。
作为比较 - 在 ideone 的 gcc 版本上,此代码甚至无法编译。这是另一个完全有效的选择。
希望这可以帮助!
在 MinGW 4.6.2 上打印200
.
但是,在 C++ ISO 标准第 26.2.2 节中:
为除或
complex
以外的任何类型float
实例化模板的效果是未指定的。double
long double
因此,您的构建环境表现出未定义的行为complex<int>
,这并不违反标准。
正如所templatetypedef
指出的,ideone 的 C99 编译器(GCC 4.3.4) 拒绝完全编译它。