Почему объект istream может использоваться как выражение bool?
Кто-нибудь знает, почему объект istream может использоваться как выражение bool? Например:
ifstream input("tmp");
int iValue;
while (input >> iValue)
//do something;
Здесь input >> iValue
возвращает ссылку на объект ifstream. Я хочу знать, почему этот объект можно использовать как выражение bool.
Я просматриваю класс ifstream и обнаруживаю, что это может быть вызвано следующей функцией-членом:
operator void * ( ) const;
Подробнее об этой функции см. здесь.
Если да, может ли кто-нибудь объяснить эту функцию мне? Прототип этой функции отличается от обычного объявления о перегрузке оператора. Каков тип возврата этой функции?
Если это не так, то в чем причина того, что объект ifstream может использоваться как выражение bool?
С нетерпением ждем вашей помощи!
чэн
Ответы
Ответ 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
.