Dlaczego cin.clear () naprawia nieskończoną pętlę spowodowaną przez złe wejście do cin?

Napisałem instrukcję switch i stworzyłem domyślną, która po prostu powie, że użytkownik wybrał złą opcję i powtórzył wejście. Chciałem się upewnić, że jeśli wystąpi jakiś problem, najpierw wyczyści bufor, więc użyłem cin.sync (), ale wpisanie „a” dla wejścia nadal powodowało nieskończoną pętlę. Dodałem cin.clear (), aby wyczyścić flagi, które dały mi działający kod ... ale moje zamieszanie wynika z tego, dlaczego działało. Czy cin.sync () nie działa, jeśli jest flaga błędu?

oświadczenie następuje, obcięte dla zwięzłości:

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