Ответ 1
Фактически, перегрузка operator>>
, используемая для чтения a bool
, допускает только значение 0
или 1
в качестве допустимого ввода. Перегрузка оператора переходит к шаблону класса num_get
, который считывает следующий номер из входного потока и затем ведет себя следующим образом (С++ 11 §22.4.2.1/6):
Если значение, которое нужно сохранить,
0
, то сохраняетсяfalse
.Если значение
1
, то сохраняетсяtrue
.В противном случае
true
сохраняется иios_base::failbit
присваиваетсяerr
.
(err
Здесь приведено состояние ошибки потока, из которого вы читаете; cin
в этом случае. Обратите внимание, что существует дополнительный язык, определяющий поведение при использовании манипулятора boolalpha
, который позволяет логическим быть вставлены и извлечены с использованием их имен, true
и false
; я пропустил эти другие детали для краткости.)
Когда вы вводите значение, отличное от нуля или единицы, состояние сбоя устанавливается в потоке, что приводит к сбоям в дальнейших отрывах. answer
установлен на true
и остается true
навсегда, вызывая бесконечный цикл.
Вы должны проверить состояние потока после каждого извлечения, чтобы проверить, удалось ли выполнить извлечение и действительно ли поток находится в хорошем состоянии. Например, вы можете переписать свой цикл как:
bool answer = true;
while (std::cin && answer)
{
std::cout << "\nInput?\n";
std::cin >> answer;
}