Ответы выше являются информативными. Здесь я просто даю дополнительный комментарий.
std::cin
является объектом класса istream
и представляет собой стандартный поток ввода (т.е. клавиатуру), который соответствует stdin
в C stream .
cin >> x
сначала прочитает int из стандартного входного потока и присвоит его x
. После этого верните ссылку на себя cin
. Таким образом, возвращаемое значение вызова функции cin >> x
по-прежнему cin
.
Таким образом, с точки , если условия , if(cin)
и if(cin >> x)
похожи друг на друга. Стандарт IO Library определяет функцию для потока следующим образом (зависит от реализации):
explicit operator bool() const; // C++11
или
operator void*() const; //C++98, C++2003
Из этих двух объявлений мы знаем, что они приводят тип потока прямо или косвенно (через void*
pinter к bool
, что очевидно) к bool
типу.
В этих двух функциях они зависят от некоторых базовых IO steam статусов (полей классов), чтобы определить, возвращать ли false или true (для void*
, это nullptr
или нет).
cin
является экземпляром класса istream
, который наследует функцию casting-to-bool . Так работает!