C 11 では、削除された関数は完全に消去されず、代わりにオーバーロード解決に参加します。この機能は 2 つの主な目的を果たします。
暗黙的な変換の防止
「= delete」構文の有用性の半分は、呼び出し元が特定のパラメーターを使用して特定の関数を呼び出すことを禁止することにあります。種類。その目的は、特定のシナリオでの暗黙的な変換を阻止することです。特定のオーバーロードを禁止するには、オーバーロードの解決に参加する必要があります。
明示的な呼び出しの確保
「= delete」構文で関数を完全に消去する場合、これは本質的に、宣言を完全に省略することと同じになります。これにより、次のようなシナリオが可能になります。
onlydouble val(20); // Legal in C++
コンパイラーはすべてのコンストラクターを考慮し、二重パラメーターを対象としたコンストラクターを呼び出すことができる暗黙の変換を識別します。
対照的に、"= delete" オーバーロード解決に参加しています:
onlydouble val(20); // Error in C++
コンパイラーは、削除されたコンストラクターを含むすべてのコンストラクターを評価します。整数リテラルとの完全一致が検出され、削除された関数を呼び出そうとしたためエラーがスローされます。
「= delete」の役割の明確化
= delete」構文は、単に「これは存在しない」というだけでなく、「これを禁止します」を意味します。これは具体的な意味合いを伴うより強力な声明です。 「これは存在しません」を表す別の構文は必要ありません。これは、宣言を省略することですでに暗黙的に示されているためです。
まれに、それを示す明確な方法がないために、特定のルールのあいまいさが発生することがあります。コピーコンストラクターが存在しません。ただし、コピー コンストラクターのような特殊なコンストラクターはクラスに固有です。問題は、それらが存在しないことを示すのではなく、それらを呼び出すことが合法であるかどうかにあります。
結論
C 11 で削除された関数は、オーバーロード解決を容易にするために参加します。エラー報告をクリアし、明示的な関数呼び出しを強制します。これにより、開発者は曖昧で意図しない変換を防止し、プログラムの正確性と明確性を確保できます。
以上がC 11 で削除された関数がオーバーロードの解決に関与するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。