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

╄→尐↘猪︶ㄣ 提交于 2019-12-18 04:33:29

问题


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.



来源:https://stackoverflow.com/questions/11108587/why-does-abscomplexint-always-return-zero

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!