Por que o cin.clear () corrige um loop infinito causado pela entrada incorreta no cin?

Eu escrevi uma declaração switch, e criei um padrão que simplesmente diria que o usuário escolheu uma opção ruim e repita a entrada. Eu queria ter certeza de que, se houvesse um problema, ele limparia o buffer primeiro, então usei cin.sync (), mas inserir um 'a' para a entrada ainda causava um loop infinito. Eu adicionei cin.clear () para limpar as bandeiras que me deram código de trabalho ... mas minha confusão é porque funcionou. O cin.sync () não funciona se houver um sinalizador de falha?

a declaração segue, truncada por brevidade:

while(exitAllow == false)
{
    cout<<"Your options are:\n";
    cout<<"1: Display Inventory\n";
    /*truncated*/
    cout<<"5: Exit\n";
    cout<<"What would you like to do? ";

    cin.clear();   //HERE IS MY CONFUSION//
    cin.sync();
    cin>>action;
    switch(action)
    {
        case 1:
                    /*truncated*/
        case 5:
            exitAllow = true;
            break;
        default:
            cout<<"\ninvalid entry!\n";
            break;
    }
}

questionAnswers(1)

yourAnswerToTheQuestion