ホームページ  >  記事  >  バックエンド開発  >  C におけるユニバーサル参照と転送参照の違いは何ですか?

C におけるユニバーサル参照と転送参照の違いは何ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-10 12:53:02491ブラウズ

What is the Difference Between Universal References and Forwarding References in C  ?

ユニバーサル参照と転送参照の概念を理解する

C では、ユニバーサル参照と転送参照の区別がわかりにくい場合があります。どちらの用語も同じ概念を指しますが、その正確な定義は時間の経過とともに進化してきました。

C 11 では、「ユニバーサル参照」という用語が、右辺値参照と左辺値参照の両方を受け入れるテンプレート パラメーターの機能を説明するために導入されました。 。これは、cv 修飾されていないテンプレート パラメーターへの右辺値参照を使用することで実現されました。

ただし、C 14 の導入により、より正確な用語「転送参照」が採用されました。 C 14 標準で定義されているように、転送参照は「CV 修飾されていないテンプレート パラメーターへの右辺値参照」です。

主な違い

ユニバーサルとの主な違いそして参照の転送はそのセマンティクスにあります。どちらも右辺値参照と左辺値参照の両方を受け入れますが、標準では、転送参照の場合、引数が左辺値の場合、指定された引数に対して推定される型は「A への左辺値参照」であることが明確化されています。

Forwarding

「転送参照」という用語は、関数本体内での std::forward 関数の使用を意味するものではないことに注意することが重要です。転送の側面は、タイプ推論プロセスのみを指します。参照が後で転送されるかどうかは関係ありません。

次の関数テンプレートを考えてみましょう。

template<typename A>
void foo(A&& a) {
  // Forwarding does not occur here
}

この例では、パラメータ a のタイプは転送参照です。左辺値が引数としてこの関数に渡された場合、 a の型は「A への左辺値参照」として推定されます。ただし、関数本体は転送を実行しません。

以上がC におけるユニバーサル参照と転送参照の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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