Как определить отрицательные числа как ошибку синтаксического анализа при чтении беззнаковых целых чисел?

Я хочу читать беззнаковые целые числа в 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") как ошибку преобразования?

10
задан Baum mit Augen 3 April 2018 в 14:21
поделиться