2010-08-04 71 views
2

我有在Ubuntu 10.04同一問題使用GCC4.4,同樣的代碼工作在RH 5.5 細使用gcc4.1stringstream在無符號類型中失敗「流」負值?

#include <sstream> 
#include <iostream> 

int main(int argc, char** argv) { 

    std::stringstream myStream; 
    myStream << "-123"; 

    unsigned int myUInt; 
    myStream >> myUInt; 

    if(myStream.fail()) { 
    std::cout << "FAILED" << std::endl; 
    } 
} 

不給失敗了,我已經發現了這一點:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39802

它說,它在gcc4.1糾正,不 肯定的,如果小姐的行爲(除非我失去了一些東西) 涉及同樣的問題。

回答

1

我不知道爲什麼你期待它失敗。的sscanf()也不會失敗,但讀出的號,以及C++流應該像scanf的功能的工作:

#include <stdio.h> 

int main(int argc, char** argv) { 
    unsigned int n; 
    if (! sscanf("-1", "%ud", & n)) { 
     printf("fail\n"); 
    } 
    else { 
     printf("%ud", n); 
    } 
} 

打印4294967295d。

另請參閱stringstream unsigned conversion broken?

+0

因爲在RH5.4上有4.1編譯器會失敗。此外,我不確定stringstream必須像scanf那樣行事。更不用說boost :: lexical_cast依賴於它必須失敗的事實,事實上我發現stringstream沒有失敗,因爲boost :: lexical_cast (「 - 123」)不是拋出。 您發佈的鏈接最後說明它將被修復爲4.4.1,但實際上代碼失敗,並且4.4.3 – 2010-08-04 15:48:24

+0

@kalman是的,那就是錯誤!它在4.1,並在稍後修復。另外,你可以從另一個問題看到,關於什麼是「正確的」行爲存在一些爭論。 – 2010-08-04 15:50:14

+0

所以,你的意思是串流在無符號類型流中失敗「-123」,這是一個錯誤,而不是一個功能? – 2010-08-04 15:55:27