オーバーロードの解決に C 11 で削除された関数が含まれる理由
C 11 では、関数を「削除済み」としてマークする = delete 構文が導入され、彼らの呼びかけ。これにより、これらの関数が完全に削除されるのではなく、依然としてオーバーロード解決に参加しているのはなぜかという疑問が生じます。
= delete の主な目的は、特定のパラメーターを持つ特定の関数の呼び出しを防ぐことです。特に、意図しない結果を招く可能性があるシナリオにおいて、暗黙的な変換を禁止することを目的としています。したがって、特定のオーバーロードを効果的に禁止するには、= delete がオーバーロード解決に参加することが不可欠です。
次の例を考えてみましょう。
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
= delete が関数を完全に削除した場合、同じ結果になります。次のようになります:
struct onlydouble2 { onlydouble2(double); };
この場合、次のコードは次のようになります。 valid:
onlydouble2 val(20);
コンパイラは、整数を受け取るコンストラクターを呼び出そうとしますが、暗黙的に 20 を double に変換し、double を受け取るコンストラクターを正常に呼び出します。
ただし、 = delete を使用すると、intmax_t を受け取るonlydouble コンストラクターの呼び出しは明示的に禁止されます。コンパイラは暗黙的な変換を試行せず、代わりにエラーを発行して、この禁止されたオーバーロードの使用を防ぎます。
さらに、= delete は、「これは存在しない」ではなく「これを禁止する」ことを意味します。 C 仕様では、「存在しない」関数の概念は定義されていません。代わりに、特定の呼び出しを明示的に禁止するメカニズムを提供し、プログラマがコンパイラの動作を制御し、不要な暗黙的な変換を防止できるようにします。
以上が削除された C 11 関数が依然としてオーバーロード解決に参加しているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。