與VS2010下面的代碼打印0
,出乎我的意料:爲什麼abs(複數<int>)總是返回零?
#include <complex>
#include <iostream>
using namespace std;
int main(void)
{
complex<int> z(20, 200);
cout << abs<int>(z) << endl;
return 0;
}
它工作正常,當類型爲double
。
與VS2010下面的代碼打印0
,出乎我的意料:爲什麼abs(複數<int>)總是返回零?
#include <complex>
#include <iostream>
using namespace std;
int main(void)
{
complex<int> z(20, 200);
cout << abs<int>(z) << endl;
return 0;
}
它工作正常,當類型爲double
。
根據該C++ ISO規格,§ 26.2/2:
實例化該模板
complex
比float
,double
或long double
是未指定的其它任何類型的影響。
換句話說,當你實例化complex<int>
時,編譯器可以做任何想做的事情。從語言的角度來看,你在這裏得到的事實是完全明確的行爲。
爲了比較 - 在ideone's version of gcc,這個代碼甚至沒有編譯。這是另一個完全有效的選擇。
希望這會有所幫助!
在MinGW 4.6.2上打印200
。
然而,在C++ ISO標準部分26.2.2:
實例化該模板
complex
比float
,double
或long double
其他任何類型的效果是不確定的。
因此,您的構建環境出現complex<int>
的未定義行爲,這不符合標準。
由於templatetypedef
指出,ideone's C99 compiler(GCC 4.3.4)拒絕完全編譯它。
嗯,我甚至不允許使用我自己的實數類型?這令人失望。 –
@ PaulManta-是的,我猜不。我不知道這是爲什麼。 – templatetypedef
謝謝你的回答。當行爲未指定時返回0,200或42可能確實符合標準,但對於像我這樣的休閒程序員來說,這確實是一個很大的缺陷。 – Artium