Подтвердить что ты не робот

Почему объект istream может использоваться как выражение bool?

Кто-нибудь знает, почему объект istream может использоваться как выражение bool? Например:

ifstream input("tmp");
int iValue;
while (input >> iValue)
    //do something;

Здесь input >> iValue возвращает ссылку на объект ifstream. Я хочу знать, почему этот объект можно использовать как выражение bool. Я просматриваю класс ifstream и обнаруживаю, что это может быть вызвано следующей функцией-членом:

operator void * ( ) const;

Подробнее об этой функции см. здесь. Если да, может ли кто-нибудь объяснить эту функцию мне? Прототип этой функции отличается от обычного объявления о перегрузке оператора. Каков тип возврата этой функции?
Если это не так, то в чем причина того, что объект ifstream может использоваться как выражение bool?
С нетерпением ждем вашей помощи!

чэн

4b9b3361

Ответ 1

Точный механизм, который позволяет использовать istream как булево выражение, был изменен в С++ 11. Раньше это было неявное преобразование в void*, как вы уже нашли. В С++ 11 вместо этого это преобразование explicit в bool.

Использование istream или ostream в логическом выражении было включено, чтобы программисты на С++ могли продолжать использовать выражение с побочными эффектами как условие цикла while или for:

SomeType v;

while( stream >> v )
{
    // ...
}

И причина, по которой программисты делают это и хотят этого, заключается в том, что он дает более сжатый код, код, который легче воспринимать с первого взгляда, чем, например. & Hellip;

for( ;; )
{
    SomeType v;

    stream >> v;
    if( stream.fail() )
    {
        break;
    }
    // ...
}

Однако в некоторых случаях даже такая подробная структура может быть предпочтительной. Это зависит.

Приветствия и hth.,

Ответ 2

Это оператор трансляции заданного типа. operator T () - оператор трансляции типа T. В операторе if ifstream преобразуется в void*, а затем void* преобразуется в bool.