Избегайте или предупреждайте о неявном преобразовании из 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
).