Избегайте или предупреждайте о неявном преобразовании из const char * в bool в GCC

Рассмотрим следующий код:

void foo(bool parameter) {
    std::cout << parameter << "\n";
}

int main() {
    foo("const char *argument");
}

Я хочу, чтобы компилятор выдавал предупреждение при передаче const char* вместо bool в качестве параметра функции foo.

Но GCC неявно преобразует его. Я пробовал -Wall, -Wextra и -Wpedantic, но ни один из них не выдает предупреждение. Есть ли флаг, который может перехватить такое неявное преобразование (недопустимый тип параметра)?

Не обращайте внимания на тот факт, что функция имеет аргумент типа bool, который некоторые могут воспринимать как плохой стиль кода. Я не могу изменить эту часть.

Стандарт только упоминает, что такое неявное преобразование произойдет:

Значение целочисленного типа с перечислением с плавающей точкой, с незаданной областью, указатель и указатель на член может быть преобразовано в значение типа bool.

Я знаю, что такое поведение очень удобно в операторах if (ptr), но для меня, в случае передачи параметров, оно явно неверно и является источником ошибок.

Ответы

Ответ 1

Вы можете объявить перегрузку foo для указателей как deleted:

template <class T>
void foo(T*) = deleted;

Или еще лучше, как в комментариях @Ted, просто объявить ванильную перегрузку, чтобы не компилировать какие-либо неявные преобразования:

template <class T>
void foo(T) = deleted;

Ответ 2

Я хочу, чтобы компилятор выдавал предупреждение при передаче const char* вместо bool в качестве параметра функции foo... Я пробовал -Wall, -Wextra и -Wpedantic

Вам нужно добавить -Wconversion к вашим флагам компилятора. Обратите внимание, что, похоже, работает с clang (последняя или более старая версия), но не с gcc.

Если это вызывает слишком много предупреждений, которые вы не хотите обрабатывать, вы можете выборочно включить -Wstring-conversion (только clang).