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

削除された C 11 関数が依然としてオーバーロード解決に参加しているのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 10:13:18210ブラウズ

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

オーバーロードの解決に 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 サイトの他の関連記事を参照してください。

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