問題タブ [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 投票する
2 に答える
2318 参照

c++ - ユニバーサル リファレンスの適切な使用

C++11 より前は、次のようなコードを書いていました。

しかし、移動セマンティクスを使用すると、(少なくとも場合によっては) 関数が右辺値参照をパラメーターとして取り、これらのオーバーロードを追加できるようになる可能性があります。

私が集めたものから、大きな関数内でこれらのオーバーロードを呼び出せるようにしたい場合は、次のように見える完全な転送を使用する必要があります (少し読みにくいですが、テンプレート タイプの適切な命名規則):

私の問題はこれです:私の小さな関数に他のオーバーロードがある場合、意図されていない型のパラメーターを使用して大きな関数を呼び出すことが可能になるということではありませんか?

これを防ぐためにこれが機能する可能性があると思います:

A、B、または C に暗黙的に変換可能な型で大きな関数を呼び出そうとすると、どのように動作するかがわからないため、制限が厳しすぎるかどうかはわかりませんが...

でも... これでうまくいくとしても、本当に他に選択肢がないのでしょうか? (というか…目に優しくない)

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

c++ - これは普遍的な参照ですか?ここで std::forward は意味がありますか?

次のコード スニペットを考えてみましょう。これは、推定される型に特化したクラス テンプレートのインスタンスを関数テンプレートに構築させるという一般的なイディオムを使用しています。たとえば、std::make_uniqueandstd::make_tupleで見られます。

Scott Meyers の「ユニバーサル リファレンス」のコンテキストでは、引数 to はmake_fooユニバーサル リファレンスです。のコンストラクターへの引数は、その型は ですが、(一般に) 推定されないため、ユニバーサル参照ではありません。U&&UfooT&&T

しかし、 のコンストラクターがfooによって呼び出される場合、 のコンストラクターへの引数をユニバーサル参照であるmake_fooと考えるのは理にかなっているように思えます。関数 template によって推定されているからです。の型が両方の関数で同じになるように、同じ参照折りたたみルールが適用されます。この場合、 と の両方が演繹された と言えます。fooTmake_foovTU

だから私の質問は2つあります:

  • 私の例のように、呼び出し元によってユニバーサル参照コンテキスト内で推定されfooた限られたケースで、コンストラクターへの引数をユニバーサル参照であると考えるのは理にかなっていますか?T
  • 私の例では、両方ともstd::forward賢明な使用ですか?
0 投票する
1 に答える
5334 参照

c++ - 一般的なラムダで「auto&&」を完全に転送する方法は?

C++14 は汎用ラムダをサポートしています。ただし、次のコードは clang 3.4 で拒否されます。

auto&&一般的なラムダで完全に転送する方法は?

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

c++ - std::tuple の値を引数として使用して関数を呼び出す方法は?

私が欲しいのは、実装方法とf(magic_xxx(t))同等にするf(1, 2)ことです?

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

c++ - 移動セマンティクスと完全転送の違い

この質問から、移動セマンティクスとは何かを既に理解しています: 移動セマンティクスとは何ですか?

しかし、移動のセマンティクスに関して、完全な転送とは何かをまだ理解していません。

誰かが簡単な英語で簡単な例を説明して、完璧な転送が何を意味するかを説明できますか?

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

c++ - bind を使用して可変数の引数を転送できますか?

C++14 では、任意の数の引数を完全に転送するラムダを記述できます。

を使用して同じ効果を達成する方法はありbindますか? によって作成された関数オブジェクトbindは任意の数の引数を取ることを知っています。また、そのようなオブジェクトはバインドされていない引数に対して完全転送を使用することを知っていますが、bind渡されたすべての引数に対して完全転送を使用する関数オブジェクトを作成するように指示する方法はありますか?への呼び出しにプレースホルダーがなかったとしてもbind

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

c++ - なぜ完全に転送された値 (ファンクター) を使用するのですか?

C++11 (および C++14) では、ジェネリック プログラミングを対象とする追加の言語構造と改善が導入されています。これらには次のような機能が含まれます。

  • R値参照
  • 参照の崩壊
  • 完全転送
  • 移動セマンティクス、可変個引数テンプレートなど

私はC++14 仕様の以前のドラフト(現在は更新されたテキストを含む) と§20.5.1の例のコードを閲覧していました。

オンラインはこちら[intseq.general]/2 .

質問

  • 関数が転送された理由、つまりなぜfですか?apply_implstd::forward<F>(f)(std::get...
  • 関数をそのまま適用しないのはなぜf(std::get...ですか?
0 投票する
1 に答える
643 参照

c++ - 2 番目の std::forward 特殊化が必要なのはなぜですか?

http://thbecker.net/articles/rvalue_references/section_08.htmlstd::forwardがどのように機能するかについてのこの説明から理解できる限り、次の 1 つのバージョンのみを省くことができます。std::forward

しかし実際には、( http://en.cppreference.com/w/cpp/utility/forward ) 2 番目のバージョンがあります。

tの定義方法のみが前のものと異なります(with &&)

では、なぜそれが必要なのでしょうか? 外すと何が壊れますか?