Я нашел этот пример, когда проверил PCLint исходный код проекта, над которым я работаю. Вот фрагмент кода:
QString foo()
{
return false;
}
Я скомпилировал код и убедился, что он возвращает пустую строку. Реальный пример - большой метод в большом классе, и где-то в какой-то удаленной ветке if было это изолированное
return false;
Хорошо, это плохое кодирование, позор разработчику (с помощью SVN / blame я даже смог найти, кто это сделал :-)), но, серьезно, почему компилятор не жалуется?
Моя теория заключается в том, что компилятор переводит
return false;
в
return QString(((const char *) false));
Однако, я не вижу всех элементарных шагов, выполняемых компилятором, чтобы сделать такой вывод. Сначала он пробует все конструкторы QString, и находит
QString(const * char);
но потом? Как он определяет, что можно перейти от bool к const char *. Или он автоматически приводит bool к любому типу указателя всякий раз, когда вы используете bool там, где ожидается указатель?
Вторая часть вопроса. Поскольку все эти неявные преобразования типов довольно опасны (зачем разработчику писать 'return false;', если он хотел сказать "вернуть пустую строку"?), есть ли способ (например, переключатель компилятора), чтобы о таких ситуациях хотя бы сообщалось в виде предупреждения? Я попробовал -Wall в g++, и он не вывел никакого предупреждения.
EDIT
Спасибо за подсказки. false, похоже, имеет особое обращение. Если я делаю
return true;
я получаю:
error: conversion from ‘bool’ to non-scalar type ‘QString’ requested
Я использую g++ 4.4.3 на Ubuntu. Как указывалось в разных комментариях, другие компиляторы сообщают об этой проблеме.