削除された関数を使用した C 11 でのオーバーロードの解決
C 11 では、= delete 構文を使用して関数を「削除済み」としてマークすることができます。 」この構文により、コンパイラーによる関数本体の生成が妨げられ、その直接呼び出しが禁止されます。ただし、これらの削除された関数は、入力パラメーターのセットを指定して呼び出すのに最も適切な関数を決定するプロセスであるオーバーロード解決に引き続き参加しています。
この機能が役立つのはなぜですか?削除された関数がコードから完全に削除されずに非表示になるのはなぜですか?
主な理由は、パラメーターの型に基づいて特定のオーバーロードを無効にすることです。削除された関数はオーバーロードの解決に参加することで、意図しない動作を引き起こす可能性のある暗黙的な変換を防ぎます。次の例を考えてみましょう:
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
delete によって関数が完全に削除された場合、= delete 構文は事実上次と同等になります:
struct onlydouble2 { onlydouble2(double); };
この変更により、次のコードになります。 Legal:
onlydouble2 val(20);
コンパイラは、整数リテラル 20 を暗黙的に double に変換しようとします。 double を取るコンストラクターを呼び出します。
対照的に、コンストラクターが削除された元の例では、コンパイラーは関数パラメーター (std::intmax_t) と引数 (20) の間の完全な一致を検出します。削除された関数を呼び出し用に選択したため、エラーが発生します。
したがって、= delete 構文を使用すると、パラメーターの型に基づいて呼び出される関数をより強力に制御できます。これにより、意図しない結果を引き起こす可能性のある暗黙的な変換が防止されます。
さらに、C 仕様では「これは存在しない」という概念は必要ありません。次の理由からです。
以上がC 11 で削除された関数はオーバーロードの解決にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。