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)