如何在读取无符号整数时检测负数作为解析错误?

thi*_*ton 10 c++ iostream

我想从C++ iostream中读取基数为10(十进制)表示的无符号整数,至少具有基本的错误检测.在我看来,减号在这种情况下显然是一个错误,因为无符号整数没有任何符号.但是,gcc的观点不同:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream a("5"), b("-0"), c("-4");
    unsigned int i;
    a >> i; if ( a ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    b >> i; if ( b ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    c >> i; if ( c ) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我一个输出

4294967292
Run Code Online (Sandbox Code Playgroud)

对于最后一行,好像已经读取了有符号整数-4并将其转换为unsigned int.

显然,海湾合作委员会的人将此视为一项功能.是否有一些标准要求这种行为,并且是否有任何方法没有编写自己的解析器来摆脱它,即检测"-4"(可能是"-0")作为转换错误?

Ste*_*sop 6

咨询C++ 03,22.2.2.1.2/11,格式继承自scanf和朋友,这反过来都说转换后的字符序列是"可选的签名",即使对于具有无符号输出的那些.strtoul是一样的.

所以,我想你可以说强制行为的标准是C++ 03的C89,C++ 11的C99.

由于-碰巧只允许作为第一个字符,我想解决方法是peek在使用之前检查它operator>>.