web-dev-qa-db-fra.com

Évitez ou avertissez de la conversion implicite de const char * en bool dans GCC

Considérez le code suivant:

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

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

Je veux que le compilateur émette un avertissement lors du passage de const char* Au lieu de bool comme paramètre pour fonctionner foo.

Mais GCC le convertit implicitement. J'ai essayé -Wall, -Wextra Et -Wpedantic, Mais aucun de ces messages n'émet d'avertissement. Existe-t-il un indicateur qui pourrait intercepter une telle conversion implicite (type de paramètre non valide)?

Ignorez le fait que la fonction a un argument de type bool, que certains peuvent considérer comme un mauvais style de code. Je ne peux pas refactoriser cette partie.

La norme mentionne simplement une telle conversion implicite se produira:

Une valeur prédéfinie d'énumération intégrale, à virgule flottante, non étendue, pointeur et pointeur vers membre peut être convertie en une valeur de type bool.

Je sais qu'un tel comportement est très pratique dans les instructions if (ptr), mais pour moi, dans le cas du passage de paramètres, il est clairement erroné et source de bugs.

24
Szymon Zimnowoda

Vous pouvez déclarer une surcharge de foo pour les pointeurs comme deleted:

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

Ou mieux encore, comme le commentent @Ted, déclarez simplement une surcharge Vanilla pour ne pas compiler de conversions implicites:

template <class T>
void foo(T) = delete;
28
Paul Evans

Je veux que le compilateur émette un avertissement lors du passage de const char* au lieu de bool comme paramètre de la fonction foo. ... J'ai essayé -Wall, -Wextra, et -Wpedantic

Vous devez ajouter -Wconversion à vos drapeaux de compilation. Notez que cela semble fonctionner avec clang (version récente ou plus ancienne), mais pas avec gcc.

Si cela déclenche trop d'avertissements que vous ne souhaitez pas gérer, vous pouvez activer de manière sélective -Wstring-conversion (clang uniquement).

16
lubgr