问题
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
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!
回答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
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.
来源:https://stackoverflow.com/questions/11108587/why-does-abscomplexint-always-return-zero