2010-08-04 42 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