std::cin jest obiektem klasy std::basic_istream. Klasa ta ma przeciążony operator >>, który zwraca std::basic_istream &, czyli referencję do strumienia, z którego wczytujemy. W kontekście while() oczekiwane jest wyrażenie typu bool. Oznacza to, że trzeba skonwertować std::basic_istream & do typu bool. Da się tak, ponieważ klasa ta ma też przeciążony operator bool, który zwraca stan strumienia (zwraca dokładnie to samo co !std::cin.fail()).
Ciekawostka: przed C++11 nie mógł to być operator bool, bo np. operatora tego można także użyć w kontekście operacji arytmetycznych czy ogólne porównać dwa obiekty, które nie mają ze sobą niczego wspólnego. Aby to obejść używano operatora void *, który zwracał NULL, jeżeli w strumieniu ustawione były flagi błędów. To rozwiązanie oczywiście też nie jest idealne. Lepszym rozwiązaniem jest safe bool idiom, ale to coś, co trzeba napisać dodatkowo. W C++11 dodano możliwość określania operatorów słowem explicit tzn. że zostaną one użyte tylko podczas jawnych konwersji oraz podczas konwersji w konkretnych kontekstach - np. w while. (Ta zmiana powoduje też, że wspomniany idiom jest już niepotrzebny)