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
时,它可以正常工作。
答案 0 :(得分:23)
根据C ++ ISO规范,§26.2/ 2:
未指定
complex
,float
或double
以外的任何类型实例化模板long double
的效果。
换句话说,编译器可以在实例化complex<int>
时执行任何操作。从语言的角度来看,你在这里获得0的事实是非常明确的行为。
为了进行比较 - 在ideone's version of gcc上,此代码甚至无法编译。这是另一个完全有效的选择。
希望这有帮助!
答案 1 :(得分:6)
在MinGW 4.6.2上,它打印200
。
但是,在C ++ ISO标准第26.2.2节中:
未指定
complex
,float
或double
以外的任何类型实例化模板long double
的效果。
因此,您的构建环境显示complex<int>
的未定义行为,这与标准不符。
正如templatetypedef
指出的那样,ideone's C99 compiler(GCC 4.3.4)拒绝完全编译它。