Возьмите эту игрушку код:неявного преобразования потока в BOOL
#include <iostream>
#include <fstream>
int main() {
std::ifstream is;
// perform read
// ...
if (!is) // works
std::cout << "fail";
if(is == false) // error C2678
std::cout << "fail";
return 0;
}
Вы получили бы следующий нелогичные результаты: if(!is)
компилирует и if(is==false)
дает
ошибка C2678: бинарное «= = ': оператор не найден, который принимает левый операнд типа' std :: ifstream '(или нет приемлемого преобразования)
(для VS2015 - аналогичные ошибки в gcc и clang).
Стандарт говорит (согласно this answer):
Действительный C++ 2003 код, который опирается на неявные логических преобразований будет не компилировать с этим стандартом. Такие преобразования происходят в следующих условиях:
передавая значение функции, которая принимает аргумент типа BOOL;
с использованием оператора == для сравнения с ложным или истинным;
возвращение значения из функции с возвратным типом bool;
инициализация элементов типа bool посредством инициализации агрегата;
Инициализация const bool &, который будет привязан к временному.
Насколько я могу сказать if(is==false)
явно требуется потерпеть неудачу, но как же if(!is)
не? Не квалифицируется ли это как «неявное логическое преобразование»?
Было ли это преобразование в bool преднамеренно опущено из случаев, перечисленных в стандарте? Возможно, это непреднамеренное упущение?
Edit: Этот код не только так:
int main() {
std::ifstream is;
// perform read
// ...
if (is) // works
std::cout << "success";
if(is == true) // error C2678
std::cout << "success";
return 0;
}
А вот присутствие оператора() не имеет значения.
Он может [потенциально работать] (http://coliru.stacked-crooked.com/a/b5f1f0d91368afc3) без явного 'operator!' – StoryTeller
Я также думаю, что он может работать так же, как 'is && true' делает –
@StoryTeller Oh круто, не знал этого. Спасибо :) – Rakete1111