ホームページ >バックエンド開発 >C++ >C 11 で削除された関数がオーバーロードの解決に関与するのはなぜですか?

C 11 で削除された関数がオーバーロードの解決に関与するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-15 12:36:10128ブラウズ

Why Do Deleted Functions in C  11 Participate in Overload Resolution?

C 11 で削除された関数がオーバーロード解決に参加する理由

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。