[...] так, что должно означать, что оператор возвращает логическое значение [...]
Не, он возвращает std::cin
(по ссылке). Причина, по которой работает while(std::cin >> value);
, заключается в том, что std::istream
(который является типом std::cin
) имеет conversion operator.
Оператор преобразования в основном допускает неявный класс (если он не помечен explicit
) для преобразования в заданный тип. В этом случае std::istream
определяет его operator bool
, чтобы вернуть ошибку (обычно failbit
);
[std::ios_base::operator bool()]
Возвращает true
, если поток не имеет ошибок и готов для операций ввода/вывода. В частности, возвращается !fail()
.
explicit operator bool() const;
Примечание, чем даже если оператор explicit
(который не должен допускать неявные преобразования, как if (std::cin);
), классификатор игнорируется, когда используется в контексте, который требует bool
, как if
, while
петли и петли for
. Это исключения, а не правила.
Вот пример:
if (std::cin >> value); //OK, a 'std::istream' can be converted into a 'bool', which
//therefore happens implicitly, without the need to cast it:
if (static_cast<bool>(std::cin >> value)); //Unnecessary
bool b = std::cin >> value; //Error!! 'operator bool' is marked explicit (see above), so
//we have to call it explicitly:
bool b = static_cast<bool>(std::cin >> value); //OK, 'operator bool' is called explicitly
'std :: cin' также имеет оператор преобразования в' bool', который используется в состоянии. –
@ πάνταῥεῖ Комментарии для комментариев, а не ответы. – Mego