Избегайте или предупреждайте о неявном преобразовании из const char * в bool в GCC - PullRequest
0 голосов
/ 04 февраля 2019

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

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), нодля меня, в случае передачи параметров, это явно неправильно и источник ошибок.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

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

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

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

template <class T>
void foo(T) = delete;
0 голосов
/ 04 февраля 2019

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

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

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

...