Возвращает поток, так что мы можем связать операцию.
Но когда вы используете объект в логическом контексте, компилятор ищет оператор преобразования, который может преобразовать его в тип, который можно использовать влогический контекст.
C ++ 11
В этом случае поток имеет explicit operator bool() const
.При вызове он проверяет флаги ошибок.Если бит-бит или битбит установлены, то он возвращает ложь, в противном случае он возвращает истину.
C ++ 03
В этом случае поток имеет operator void*() const
.Поскольку это приводит к указателю, он может использоваться в логическом контексте.При вызове он проверяет флаги ошибок.Если установлен failbit или badbit, он возвращает NULL, что эквивалентно FALSE, в противном случае он возвращает указатель на себя (или что-то еще действительное, хотя вы не должны использовать этот факт)).
Использование
Таким образом, вы можете использовать поток в любом контексте, который потребует логического теста:
if (stream >> x)
{
}
while(stream)
{
/* do Stuff */
}
Примечание. Это плохая идея - проверять поток снаружи, а затем читать / записывать его внутри телаусловный оператор / оператор циклаЭто потому, что акт чтения может сделать поток плохим.Обычно лучше выполнять чтение как часть теста.
while(std::getline(steam, line))
{
// The read worked and line is valid.
}