次のコードを検討してください。
_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)
ステートメントで非常に便利であることは知っていますが、私にとって、パラメータを渡す場合は明らかに間違っており、バグの原因となっています。
ポインタのfoo
のオーバーロードをdeleted
として宣言できます。
template <class T>
void foo(T*) = delete;
あるいは、@ Tedのコメントとして、暗黙の変換をコンパイルしないようにバニラオーバーロードを宣言するだけです。
template <class T>
void foo(T) = delete;
関数
bool
へのパラメーターとしてfoo
の代わりにconst char*
を渡すと、コンパイラーが警告を発してほしい。 ...-Wall
、-Wextra
、-Wpedantic
を試しました
コンパイラフラグに-Wconversion
を追加する必要があります。はclang
(最近または古いバージョン)では機能するようですが、gcc
では機能しないことに注意してください。
これにより、処理したくない警告が多すぎる場合は、選択的に -Wstring-conversion
(clang
のみ)を有効にすることができます。