Почему операторы iostream не перегружают оператор bool? - PullRequest
9 голосов
/ 26 августа 2009

В этот ответ Я говорю об использовании преобразования std::ifstream объекта в bool, чтобы проверить, находится ли поток в хорошем состоянии. Я заглянул в книгу Josuttis для получения дополнительной информации (стр. 600, если вам интересно), и оказалось, что iostream объекты действительно перегружают operator void*. Он возвращает нулевой указатель, когда поток плохой (который может быть неявно преобразован в false), и ненулевой указатель в противном случае (неявно преобразован в true). Почему они просто не перегружают operator bool?

Ответы [ 3 ]

13 голосов
/ 26 августа 2009

Похоже, в стандартном разделе C ++ 0x 27.4.4.3 есть ответ (выделено мое).

operator unspecified-bool-type() const;

Возвращает: если fail(), то значение, которое будет оценивать ложь в логическом контекст; в противном случае значение, которое будет оценить истину в логическом контексте. Тип возвращаемого значения не должен быть конвертируется в int.

Примечание: это преобразование можно использовать в контексты, в которых ожидается bool (например, условие if); тем не мение, неявные преобразования (например, в int) что может произойти с bool не являются разрешено, устраняя некоторые источники ошибка пользователя.

7 голосов
/ 05 августа 2011

Это пример проблемы «безопасного бул».

Вот хорошая статья: http://www.artima.com/cppsource/safebool.html.

C ++ 0x помогает ситуации с explicit функциями преобразования, а также изменениям, которые упоминает Кристо. См. Также Устаревшая ли идиома Safe-Bool в C ++ 11? .

0 голосов
/ 15 мая 2012

Новейший C ++ 11 требует, чтобы:

explicit operator bool() const;

См. C ++ 11 27.5.5.4-1. «Явное» кажется мне странным.

...