我想从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")作为转换错误?
咨询C++ 03,22.2.2.1.2/11,格式继承自scanf和朋友,这反过来都说转换后的字符序列是"可选的签名",即使对于具有无符号输出的那些.strtoul是一样的.
所以,我想你可以说强制行为的标准是C++ 03的C89,C++ 11的C99.
由于-碰巧只允许作为第一个字符,我想解决方法是peek在使用之前检查它operator>>.