web-dev-qa-db-ja.com

GCCでのconst char *からboolへの暗黙的な変換を回避または警告する

次のコードを検討してください。

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

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

関数boolのパラメーターとしてfooの代わりに_const char*_を渡すときにコンパイラーに警告を表示させたい。

しかし、GCCは暗黙的にそれを変換します。 _-Wall_、_-Wextra_、_-Wpedantic_を試しましたが、どれも警告を出しません。そのような暗黙の変換(無効なパラメーター型)をキャッチできるフラグはありますか?

関数がbool型の引数を持っているという事実を無視します。これは、一部のコードスタイルが悪いと見なされる場合があります。その部分はリファクタリングできません。

標準はそのような 暗黙の変換 が発生することを述べているだけです:

整数、浮動小数点、スコープ外の列挙、pointer、およびメンバーへのポインター型のprvalueは、bool型のprvalueに変換できます。

このような動作はif (ptr)ステートメントで非常に便利であることは知っていますが、私にとって、パラメータを渡す場合は明らかに間違っており、バグの原因となっています。

24

ポインタのfooのオーバーロードをdeletedとして宣言できます。

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

あるいは、@ Tedのコメントとして、暗黙の変換をコンパイルしないようにバニラオーバーロードを宣言するだけです。

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

関数boolへのパラメーターとしてfooの代わりにconst char*を渡すと、コンパイラーが警告を発してほしい。 ... -Wall-Wextra-Wpedanticを試しました

コンパイラフラグに-Wconversionを追加する必要があります。はclang(最近または古いバージョン)では機能するようですが、gccでは機能しないことに注意してください。

これにより、処理したくない警告が多すぎる場合は、選択的に -Wstring-conversionclangのみ)を有効にすることができます。

16
lubgr