2012-06-19 101 views
16

與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

回答

23

根據該C++ ISO規格,§ 26.2/2:

實例化該模板complexfloatdoublelong double是未指定的其它任何類型的影響。

換句話說,當你實例化complex<int>時,編譯器可以做任何想做的事情。從語言的角度來看,你在這裏得到的事實是完全明確的行爲。

爲了比較 - 在​​ideone's version of gcc,這個代碼甚至沒有編譯。這是另一個完全有效的選擇。

希望這會有所幫助!

+0

嗯,我甚至不允許使用我自己的實數類型?這令人失望。 –

+0

@ PaulManta-是的,我猜不。我不知道這是爲什麼。 – templatetypedef

+1

謝謝你的回答。當行爲未指定時返回0,200或42可能確實符合標準,但對於像我這樣的休閒程序員來說,這確實是一個很大的缺陷。 – Artium

6

在MinGW 4.6.2上打印200

然而,在C++ ISO標準部分26.2.2:

實例化該模板complexfloatdoublelong double其他任何類型的效果是不確定的。

因此,您的構建環境出現complex<int>的未定義行爲,這不符合標準。

由於templatetypedef指出,ideone's C99 compiler(GCC 4.3.4)拒絕完全編譯它。

+0

實際上它是[4.5.1](http://ideone.com/pLiug)。 – Puppy

+0

@DeadMG - 對於C99,'templatetypedef'的例子中使用的版本是4.3.4。您的鏈接使用C++ 0x,它是版本4.5.1,請參見[本頁](http://ideone.com/samples#sample_lang_44) – Unsigned