ホームページ > バックエンド開発 > C++ > C 11 で削除された関数はオーバーロードの解決にどのように影響しますか?

C 11 で削除された関数はオーバーロードの解決にどのように影響しますか?

Mary-Kate Olsen
リリース: 2024-12-15 15:22:24
オリジナル
377 人が閲覧しました

How Do Deleted Functions in C  11 Influence Overload Resolution?

削除された関数を使用した C 11 でのオーバーロードの解決

C 11 では、= delete 構文を使用して関数を「削除済み」としてマークすることができます。 」この構文により、コンパイラーによる関数本体の生成が妨げられ、その直接呼び出しが禁止されます。ただし、これらの削除された関数は、入力パラメーターのセットを指定して呼び出すのに最も適切な関数を決定するプロセスであるオーバーロード解決に引き続き参加しています。

この機能が役立つのはなぜですか?削除された関数がコードから完全に削除されずに非表示になるのはなぜですか?

主な理由は、パラメーターの型に基づいて特定のオーバーロードを無効にすることです。削除された関数はオーバーロードの解決に参加することで、意図しない動作を引き起こす可能性のある暗黙的な変換を防ぎます。次の例を考えてみましょう:

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};
ログイン後にコピー

delete によって関数が完全に削除された場合、= delete 構文は事実上次と同等になります:

struct onlydouble2 {
  onlydouble2(double);
};
ログイン後にコピー

この変更により、次のコードになります。 Legal:

onlydouble2 val(20);
ログイン後にコピー

コンパイラは、整数リテラル 20 を暗黙的に double に変換しようとします。 double を取るコンストラクターを呼び出します。

対照的に、コンストラクターが削除された元の例では、コンパイラーは関数パラメーター (std::intmax_t) と引数 (20) の間の完全な一致を検出します。削除された関数を呼び出し用に選択したため、エラーが発生します。

したがって、= delete 構文を使用すると、パラメーターの型に基づいて呼び出される関数をより強力に制御できます。これにより、意図しない結果を引き起こす可能性のある暗黙的な変換が防止されます。

さらに、C 仕様では「これは存在しない」という概念は必要ありません。次の理由からです。

  • 次のような特別な文法が存在します。関数の削除 (「これを禁止します」)
  • 暗黙的に定義された関数 (コピー コンストラクターなど) は、次の方法で存在します。デフォルト
  • オーバーロード解決は、不一致またはあいまいさを識別することで関数の「存在」を処理します
  • 削除された関数の主な目的は、存在しないことを示すのではなく、オーバーロード解決を制御することです

以上がC 11 で削除された関数はオーバーロードの解決にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート