Отвечая на на этот вопрос я провел исследование, которое действительно смущает меня.
Я заметил, что два успешно открытых потока if не равны, а два, которые терпят неудачу, равны.
Сначала я проверил cplusplus.com. operator !
возвращает статус плохого и ошибочного бита. Я думаю, что противоположностью этому будет возвращение статуса этих двух битов, но перевернутый.
- Неправильно , поскольку два успешных вызова не равны.
Итак, я подумал, что это где-то operator bool
, что-то вернет. Поэтому я попытался вернуться из ifstream и нашел istream::operator bool()
, который возвращает _Ok
.
- Все еще неправильно, однако , это, кажется, не вызывается вообще (и не могло быть, так как два успешных вызова все еще не равны).
Поэтому я изменил свой подход и проверил разборку из Visual Studio. И что я нахожу?
if (file0 != file1) {
не вызывает operator bool()
, , а скорее operator void* ()
(или действительно __imp_std::ios_base::operator void *
).
Так что у меня есть вопросы ..
- Не должен ли быть найден какой-либо
operator bool ()
найденный перед попыткой привести его к значениям указателя?
- Это какой-то
operator bool()
Я пропустил, что по очереди звонит operator void*
?
Это какая-то оптимизация, которую я не понимаю?
Или я совершенно не прав в том, что C ++ на самом деле думает , что void*
лучше, чем bool
в этом сравнении?