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
complexfor any type other thanfloat,doubleorlong doubleis 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
complexfor any type other thanfloat,doubleorlong doubleis 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With