Почему объект istream можно использовать как выражение bool? - PullRequest
23 голосов
/ 14 ноября 2011

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

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

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

operator void * ( ) const;

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

cheng

Ответы [ 2 ]

23 голосов
/ 14 ноября 2011

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

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

SomeType v;

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

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

for( ;; )
{
    SomeType v;

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

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

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

7 голосов
/ 14 ноября 2011

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

...