Ti saprà spiegare meglio qualcuno più esperto, comunque in sostanza quando provi a leggere un variabile con dati di tipo diversi da quelli dichiarati (nel tuo caso, una stringa anziché un intero) viene settato il flag failbit come spiegato qui. A quel punto prima viene richiamato il metodo clear() sullo stream, metodo che di default (quando richiamato senza argomenti, come il prototipo mostra) azzera tutti i flag di errore e poi nel ciclo while si leggono tutti i caratteri nello stream con peek() fino al carattere di newline (senza estrarli) e per ognuno di essi richiama il metodo ignore(), che invece estrare proprio (e ignora) i caratteri dallo stream, ripulendolo.

E' probabile che esistano soluzioni migliori per gestire la cosa, anche se non mi pare che esistano funzioni e/o metodi standard per farlo, come in C del resto...