Почему это компилируется и есть ли какой-нибудь переключатель компилятора, который может заставить компилятор сообщить об этом как об ошибке или предупреждении?

Я нашел этот пример, когда проверил 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. Как указывалось в разных комментариях, другие компиляторы сообщают об этой проблеме.

5
задан Giorgio 10 October 2011 в 20:41
поделиться