Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does abs(complex<int>) always return zero?

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.

like image 500
Artium Avatar asked Jun 19 '12 20:06

Artium


2 Answers

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!

like image 145
templatetypedef Avatar answered Sep 18 '22 13:09

templatetypedef


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.

like image 23
Unsigned Avatar answered Sep 21 '22 13:09

Unsigned