приоритет оператора (void * перед bool?) - PullRequest
8 голосов
/ 28 ноября 2010

Отвечая на на этот вопрос я провел исследование, которое действительно смущает меня.

Я заметил, что два успешно открытых потока 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 в этом сравнении?

1 Ответ

2 голосов
/ 28 ноября 2010

1.) Вы не можете перегружать несколько раз, но с разными типами возврата. 2.) Да, operator! возвращает badbit / failbit, но operator! является чем-то совершенно отличным от operator!=, который вы используете.

...