问题
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 thanfloat
,double
orlong 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 thanfloat
,double
orlong 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.
来源:https://stackoverflow.com/questions/11108587/why-does-abscomplexint-always-return-zero