ホームページ >バックエンド開発 >C++ >C 11 参照折りたたみルールはどのようにして完全転送を可能にするのですか?

C 11 参照折りたたみルールはどのようにして完全転送を可能にするのですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 22:27:13460ブラウズ

How Do C  11 Reference Collapsing Rules Enable Perfect Forwarding?

C 11 の参照折りたたみルールの役割

参照折りたたみルールは、C 11 で完全転送を可能にする上で重要な役割を果たします。完全転送により、値、左辺値参照、または右辺値によってパラメータをシームレスに受け入れて渡す関数参照。

参照折りたたみルール

C 11 の参照折りたたみルールは次のとおりです。

  • A& & & -> A&
  • A& & & -> A&
  • A& & & -> A&
  • A& & & & & -> A& &

参照の折りたたみの根拠

これらのルールは、パラメーターがどのように渡されるか (左辺値、右辺値、または右辺値参照によって) に関係なく、次のことを保証します。受信側関数では常に、完璧な要求タイプとして「認識」されます。 forwarding.

  • 左辺値参照へ: 左辺値参照によって左辺値を渡すとき (T& など)、折りたたみルールは "& & &" を "&" に変換し、受信側の非 const 左辺値参照にバインドするための正しい左辺値参照。
  • To Const左辺値参照: const 左辺値参照 (const T& など) によって const 左辺値を渡す場合、折りたたみルールにより const 性が保持され、パラメーターが受信側で正しい const lvalue 参照にバインドされることが保証されます。
  • To rvalue Reference: 受信した値に関係なく、右辺値参照 (例: T& &) を渡します。これにより、xvalue (一時オブジェクト) と prvalue (T& & 型の関数戻り値) の完全な転送が可能になります。

C での使用11 STL ユーティリティ関数

std::move() や std::move() などの STL ユーティリティ関数std::forward() は、内部で参照の折りたたみを利用して、完全な転送を容易にします。例:

template<class T>
void Fwd(T & &v) {
  Call(std::forward<T>(v));
}

std::forward<>左辺値参照の場合は「& &」を「&」に、右辺値参照の場合は「& &」を「& &」に折りたたんで、Call が適切な形式でパラメータを受信できるようにします。

std との関係: :remove_reference

std::remove_reference のようなユーティリティを使用して、型推論から参照を削除できます。 (例: std::remove_reference は T を返します)。ただし、これは C 11 の参照折りたたみルールの必要性を置き換えるものではありません。 std::remove_reference は単に参照レイヤーを削除するだけですが、参照折りたたみは、転送されたパラメーターが完全な転送のための正しい形式で受信されることを保証します。

以上がC 11 参照折りたたみルールはどのようにして完全転送を可能にするのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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