43

右辺値参照メンバーが何を使用しているのか疑問に思いました

class A {
  // ...
  // Is this one useful?
  Foo &&f;
};

左辺値参照メンバーと比較して、利点または欠点はありますか?それの主なユースケースは何ですか?

4

4 に答える 4

27

右辺値参照データメンバーの非常にやる気を起こさせるユースケースを見てきましたが、それはC++0xドラフトにあります。

template<class... Types>
tuple<Types&&...>
forward_as_tuple(Types&&... t) noexcept;

効果:関数への引数として転送するのに適したtの引数への参照のタプルを構築します。結果には一時変数への参照が含まれる可能性があるため、プログラムは、この関数の戻り値がその引数のいずれよりも長くならないようにする必要があります。(たとえば、プログラムは通常、結果を名前付き変数に格納しないでください)。

戻り値:tuple<Types&&...>(std::forward<Types>(t)...)

タプルには、右辺値がforward_as_tupleへの引数として使用される場合は右辺値参照データメンバーがあり、それ以外の場合は左辺値参照データメンバーがあります。

その後、forward_as_tupleは、可変個引数の引数をキャッチし、それらをタプルとして完全に転送し、後でファンクターに転送する時点で再展開する必要がある場合に役立ちます。LWG 1385で提案されたtuple_catの拡張バージョンを実装するときに、このスタイルでforward_as_tupleを使用しました。

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385

于 2011-01-23T18:51:41.510 に答える
15

Stephan T. Lavavejによると、右辺値参照データメンバーは役に立ちません。

[31:00]プログラマーが右辺値参照を取得したときに行うことは、非常に強力であるため、少し頭がおかしくなり始めるということです。彼らは、「ああ、右辺値参照データメンバーを持っている、右辺値参照ローカル変数を持っている、右辺値参照の戻り値を持っている!」そして、彼らは次のようなコードを書きます:[...]

于 2011-01-23T14:55:28.967 に答える
3
class A {
  // ...
  // Is this one useful?
  Foo &&f; 
};

この特定のケースでは、右辺値参照を使用する理由はありません。それはあなたが前にできなかったものをあなたに買わない。

ただし、パラメーター化された型を使用してデータメンバーを定義することもできます。std :: tupleは、たとえば、左辺値と右辺値の参照データメンバーをサポートします。このようにして、「完全な転送の遅延」に役立つ可能性のある式の値のカテゴリを体系化することができます。標準ドラフトには、フォームの関数テンプレートも含まれています

template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);

しかし、正直なところ、その有用性についてはよくわかりません。

于 2011-01-23T17:52:31.093 に答える
2

ここで大声で考えているだけですが、関手での使用はありませんか?コンストラクターは、実際の関数呼び出しの前に、いくつかのパラメーターを事前にバインドする「カリー化」によく使用されます。

したがって、このコンテキストでは、クラスメンバーは、次の関数呼び出しの単なるステージンググラウンド(または手動で実装されたクロージャ)であり、右辺値参照がそこで意味をなさない理由はわかりません。

しかし、「通常の」非ファンクタークラスでは、あまり意味がありません。

于 2011-01-23T15:48:01.080 に答える