Jest, właśnie while(cin) to robi. Zresztą tam masz continue w stosunku do głównej pętli, nie break.
Jedyne co to zmieniło, to nie parsujesz daty, jeśli rok w dacie nie jest dwoma cyframi tylko wypisujesz 2 i rozpatrujesz kolejny przypadek.
Tak więc błąd powoduje funkcja std::stoi(), która dostaje jako parametr inne znaki niż cyfry. Według specyfikacji rzuca ona wtedy invalid_argument exception, który spoj interpretuje najwyraźniej jako SIGABRT.