Why does abs(complex) always return zero?

2019-01-25 04:49发布

问题:

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.

回答1:

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!



回答2:

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.