Суть следующая:
Когда функция форматированного ввода-вывода получает неверные данные она устанавливает failbit потока, что сигнализирует об ошибке (когда "cin>>age;" получает букву, например).
Когда этот поток используется в дальнейшем, то прежде проверяется его состояние, если stream.good() != true, то это признак произошедшей ошибки.
Для работы с потоками используется класс sentry, который проверяет его состояние перед использованием, например:
std::istream::sentry s(cin);
if (s) {
// работаем дальше
} else {
// ошибка!
}
В вашем примере на строке:
cin >> answer;
sentry(cin) == false, поэтому работа с потоком прерывается. К тому же после такого прерывания работы функции, в потоке остаётся хвост непрочитанных данных, который будет читаться следующими вызовами чтения и это надо учитывать.
Таким образом, в данном случае необходимо использовать обработку ошибок, например:
#include <limits>
if (cin.eof() || cin.bad()) {
// Обработать при необходимости!
}
if (cin.fail()){
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Обработчик сбрасывает биты ошибок и игнорирует мусорные данные до конца строки.