Я хочу читать беззнаковые целые числа в base-10 (десятичном) представлении из C++ iostream с хотя бы рудиментарным обнаружением ошибок. На мой взгляд, знаки минус в этом случае явно будут ошибкой, потому что у беззнаковых целых чисел нет знака. Однако gcc придерживается другого мнения:
#include
#include
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;
}
выдает мне вывод
4294967292
для последней строки, как будто было прочитано знаковое целое число -4 и преобразовано в unsigned int.
Видимо, люди из GCC считают это особенностью. Есть ли какой-то стандарт, который предписывает такое поведение, и есть ли способ, кроме написания собственного парсера, выйти из этого положения, то есть обнаружить "-4" (и, возможно, "-0") как ошибку преобразования?