C ++ Read int desde istream, detectar desbordamiento

Si leo un entero desde un istream usando el operador >> y el entero representado más grande que INT_MAX, entonces la operación simplemente devuelve INT_MAX.

Actualmente estoy haciendo una comparación con INT_MAX para detectar el desbordamiento, pero si la operación se ingresa "2147483647", devolverá un error cuando en realidad no hubo ninguno y el resultado es válido.

Ejemplo:http://ideone.com/4bXyGd

#include <iostream>
#include <sstream>
#include <climits>

int main() {
    std::istringstream st("1234567890123"); // Try with 2147483647
    int result;

    st >> result;

    if (result == INT_MAX)
        std::cout << "Overflow!" << std::endl;
    else
        std::cout << result << std::endl;

    return 0;
}

¿Cuál es la forma ideológicamente correcta de hacer esto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta