問題タブ [perfect-forwarding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
2023 参照

c++ - 非 const 参照引数を持つ std::forward およびコンストラクター

右辺値参照の簡単な紹介では、非 const 参照引数を持つコンストラクターに右辺値 5 を転送するための理想的なソリューションとして、完全な転送が提案されています。

しかし:

XCode 4.2 ans G++ 4.6.1 では失敗しますが、次のようになりno known conversion from int to int&ます。

コンパイルします。何を間違えたのですか?

0 投票する
2 に答える
1343 参照

c++ - オブジェクトのメンバーの完全転送

2 つstructのがあるとします。

私は機能を持っています:

それぞれ、または完全な転送またはtog()を取る関数を作成するにはどうすればよいですか。Y&Y&&X&X&&f()

上記のコードは私の意図を示していますが、パラメーターの数が増えるにつれてあまりスケーラブルではありません。完全な転送のために機能させ、スケーラブルにする方法はありますか?

0 投票する
1 に答える
2626 参照

c++ - タプルのような可変個引数クラスの完全な転送コンストラクターを作成する方法

タプルに似たものを作成しようとしていますが、コンストラクターを書く際に問題が発生しました。

コードは次のとおりです。

これで、単純な型を初期化子として渡すと問題なく動作しますが、非自明なオブジェクトの波括弧で囲まれた初期化子リストに引数を渡そうとするとうまくいきません。

GCC-4.7 は以下を発行します。

Clang-3.1 以下:

さて、私が非常に興味を持っているのは、それがタプルで機能することです! 標準 (20.4.2.1) によると、コンストラクターがあり、それは私のものとほとんど同じです。

同じようにタプルオブジェクトを構築すると、うまくいきます!

今私は知りたいです:

A) 一体何?std::tuple が特別なのはなぜですか? また、コンパイラが正しい数の引数を推測しないのはなぜですか?

B)どうすればこれを機能させることができますか?

0 投票する
4 に答える
46805 参照

c++ - std::move と std::forward の違いは何ですか

私はここでこれを見ました: 基本クラスのMove Constructorを呼び出すMove Constructor

誰かが説明できますか:

  1. と の違いstd::movestd::forwardできればいくつかのコード例で?
  2. 簡単に考える方法と、どちらをいつ使用するか
0 投票する
1 に答える
1125 参照

c++ - 範囲ベースの宣言の適切なスタイル

この質問では、C++11の範囲ベースの明白で慣用的な使用法について説明しました。

しかし、私はあなたが使用することになっている参照の種類について疑問を持っていました。入力イテレータは右辺値を返す場合があります。によって導入された暗黙の型は、右辺値にバインドautoされると推測できますがconst、それは発生しないようです。

完全な転送を使用するための最良の一般的な方法はありますか?

ここにはマイナス面はありませんが、少し可愛すぎます。たぶん私はまだ十分なC++11を書いていません。

0 投票する
2 に答える
437 参照

c++ - const T&とT&&のオーバーロードを統合する

次の2つの関数テンプレートのオーバーロードがあります。

完全な転送を介して過負荷を統合する最初の試みは失敗しました:

私の2回目の試みと同じように:

過負荷を統一するためのクリーンな方法はありますか、それとも私はそれらを持って生きるべきですか?

0 投票する
1 に答える
426 参照

c++ - 左辺値として暗黙的に使用される右辺値テンプレート引数、および std::forwarding の動作

の使用法に関するこの例std::forwardは、私を困惑させます。これは私の編集版です:

出力は

参照に関する警告template_type_dumperは、最初のインスタンス化ではそれを示し、2 番目のインスタンス化ではdecltype(u) = int&&とを示します。U = intdecltype(u) = int&U = int&

予想どおり 2 つの異なるインスタンス化があることは明らかですが、それは私の質問です。

  1. ここでどのようstd::forwardに働くことができますか?最初のインスタンス化では、そのテンプレート引数は明示的U = intに です。右辺値参照を返す必要があることをどのように知ることができますか? U&&代わりに指定するとどうなりますか?
  2. make_unique右辺値参照を取るように宣言されています。なぜ左辺値参照になることがuできますか? 私が見逃している特別なルールはありますか?
0 投票する
1 に答える
3357 参照

c++ - C++11 std::function と完全転送

C++ 標準の std::function<>::operator() の定義が次の理由:

ではない

?

パラメータを正しく転送するには、 && が必要でありstd::forward<ArgTypes>...、呼び出しを転送するときに関数本体で使用すると思いますか?

これをテストするために std::function を部分的に再実装しましたが、&& を使用すると、後でパラメーターを値で operator() に渡そうとすると、g++ から「'xxx' 左辺値を 'xxx&&' にバインドできません」というメッセージが表示されることがわかりました。 . 右辺値/転送の概念については十分に理解できたと思いますが、まだこの点を理解できていません。私は何が欠けていますか?

0 投票する
2 に答える
1434 参照

c++ - 可変長パラメーターの並べ替え

構造体のコンストラクターに提供されるパラメーターの可変長リストを並べ替える必要があることに遭遇しました。型に基づいて並べ替えられた後、パラメーターはタプルとして格納されます。私の質問は、最新の C++ コンパイラ (例: g++-4.7) が不要なロードまたはストア命令を生成しないようにする方法です。つまり、コンストラクターが可変サイズのパラメーターのリストで呼び出されると、パラメーターの型の順序付けに基づいて、各パラメーターを適切な場所に効率的にプッシュします。

これが具体的な例です。すべてのパラメーターの基本型 (参照、右辺値参照、ポインター、または修飾子を除く) がcharint、または のいずれかであると仮定しますfloatchar基本型のすべてのパラメーターが最初に表示され、その後に基本型のすべてのパラメーターが続くようにするにはどうすればよいですか(基本型のパラメーターを最後intに残します)。floatパラメーターが指定された相対的な順序は、同種の基本型のサブリスト内で違反されるべきではありません。

例:foo::foo()は引数付きで呼び出されますfloat a, char&& b, const float& c, int&& d, char e。タプル tupe はstd::tuple<char, char, int, float, float>で、次のように構成されますtuple_type{std::move(b), e, std::move(d), a, c}

deduce_reordered_tuple_type以下に定義された構造体を検討し、メタ関数が既に実装されていると仮定します。意図したとおりに動作するように、コンストラクターをどのように記述しますか? のコードdeduce_reodered_tuple_typeが役に立つと思われる場合は、提供できます。少し長いです。

編集 1 上で説明した手法は、積極的なインライン化を実行するために、式テンプレート、可変個引数テンプレート、およびメタプログラミングを多用する数学的フレームワークに適用されます。それぞれが参照、const への参照、または右辺値参照によって渡されるいくつかの式の積を取る演算子を定義したいとします。(私の場合、式は条件付き確率表で、演算は因数積ですが、行列の掛け算のようなものも適切に機能します。)

製品を評価するには、各式によって提供されるデータにアクセスする必要があります。したがって、右辺値参照として渡された式を移動し、参照によって渡された式を const にコピーし、参照によって渡された式のアドレスを取得する必要があります。上記の手法を使用すると、いくつかの利点が得られます。

  1. 他の式は、統一された構文を使用して、この式からデータ要素にアクセスできます。これは、すべての重労働なメタプログラミング作業が事前にクラス内で行われているためです。
  2. ポインターをグループ化し、より大きな式をタプルの末尾に格納することで、スタック スペースを節約できます。
  3. 特定のタイプのクエリの実装がはるかに簡単になります (たとえば、タプルに格納されているポインターのいずれかが特定のポインターのエイリアスであるかどうかを確認します)。

ご助力ありがとうございます!