C 11 で削除された関数がオーバーロード解決に参加する理由
C 11 では、特定の関数のオーバーロードの呼び出しを防ぐために = delete 構文が導入されました。特定のパラメータのタイプ。削除された関数はオーバーロードの解決中に考慮から完全に削除されることが予想されるため、この動作は異常に見えるかもしれません。ただし、この設計上の決定には特別な理由があります。
暗黙的な変換の防止
= delete の主な目的の 1 つは、特定のシナリオでの暗黙的な変換の使用を禁止することです。オーバーロードが削除された関数がオーバーロードの解決に参加すると、コンパイラは完全に一致するものを選択するか、エラーを報告します。これにより、暗黙的な変換を使用して削除されたオーバーロードを誤って呼び出すことが防止されます。
以下の例を考えてみましょう:
struct onlydouble { onlydouble(std::intmax_t) = delete; // Prevent implicit conversion from integer onlydouble(double); };
削除されたオーバーロードが考慮から完全に削除された場合、次のコードが許可されます。 :
onlydouble val(20);
コンパイラは、整数リテラルを暗黙的に double に変換し、削除されていないオーバーロード。ただし、削除されたオーバーロードがオーバーロードの解決に関与している場合、コンパイラは、削除されたオーバーロードが整数リテラル引数と完全に一致すると識別するため、コードを拒否します。
特殊な構文と「これは存在しません」
なぜ C 11 が = delete を「これは禁止する」ではなく「これを禁止する」と定義しているのか疑問に思う人もいるかもしれません。 存在する。"答えは、存在しないことを表現するための明示的な文法が必要ないことにあります。未定義の識別子と欠落している特殊メンバー関数は、「これは存在しない」という概念を暗黙的に伝えます。
結論
C 11 で削除された関数は、暗黙的なものを防ぐためにオーバーロード解決に参加します。変換を実行し、特定のパラメータ タイプの使用を強制します。この設計機能により、関数オーバーロードの呼び出しを正確に制御できるため、暗黙的な変換が望ましくないシナリオや曖昧さが生じるシナリオで利点が得られます。
以上がC 11 で削除された関数が依然としてオーバーロード解決に参加しているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。