The following code with VS2010 prints 0
, contrary to my expectations:
#include <complex>
#include <iostream>
using namespace std;
int main(void)
{
complex<int> z(20, 200);
cout << abs<int>(z) << endl;
return 0;
}
It works fine when the type is double
.
According to the C++ ISO spec, §26.2/2:
The effect of instantiating the template complex
for any type other than float
, double
or long double
is unspecified.
In other words, the compiler can do whatever it wants to when you instantiate complex<int>
. The fact that you're getting 0 here is perfectly well-defined behavior from a language perspective.
For a comparison - on ideone's version of gcc, this code doesn't even compile. That's another perfectly valid option.
Hope this helps!
On MinGW 4.6.2 it prints 200
.
However, in the C++ ISO standard section 26.2.2:
The effect of instantiating the template complex
for any type other than float
, double
or long double
is unspecified.
So your build environment is exhibiting undefined behavior for complex<int>
, which is not against the standard.
As templatetypedef
pointed out, ideone's C99 compiler (GCC 4.3.4) refuses to compile it altogether.