問題タブ [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.
c++ - ユニバーサル リファレンスの適切な使用
C++11 より前は、次のようなコードを書いていました。
しかし、移動セマンティクスを使用すると、(少なくとも場合によっては) 関数が右辺値参照をパラメーターとして取り、これらのオーバーロードを追加できるようになる可能性があります。
私が集めたものから、大きな関数内でこれらのオーバーロードを呼び出せるようにしたい場合は、次のように見える完全な転送を使用する必要があります (少し読みにくいですが、テンプレート タイプの適切な命名規則):
私の問題はこれです:私の小さな関数に他のオーバーロードがある場合、意図されていない型のパラメーターを使用して大きな関数を呼び出すことが可能になるということではありませんか?
これを防ぐためにこれが機能する可能性があると思います:
A、B、または C に暗黙的に変換可能な型で大きな関数を呼び出そうとすると、どのように動作するかがわからないため、制限が厳しすぎるかどうかはわかりませんが...
でも... これでうまくいくとしても、本当に他に選択肢がないのでしょうか? (というか…目に優しくない)
c++ - これは普遍的な参照ですか?ここで std::forward は意味がありますか?
次のコード スニペットを考えてみましょう。これは、推定される型に特化したクラス テンプレートのインスタンスを関数テンプレートに構築させるという一般的なイディオムを使用しています。たとえば、std::make_unique
andstd::make_tuple
で見られます。
Scott Meyers の「ユニバーサル リファレンス」のコンテキストでは、引数 to
はmake_foo
ユニバーサル リファレンスです。のコンストラクターへの引数は、その型は ですが、(一般に) 推定されないため、ユニバーサル参照ではありません。U&&
U
foo
T&&
T
しかし、 のコンストラクターがfoo
によって呼び出される場合、 のコンストラクターへの引数をユニバーサル参照であるmake_foo
と考えるのは理にかなっているように思えます。関数 template によって推定されているからです。の型が両方の関数で同じになるように、同じ参照折りたたみルールが適用されます。この場合、 と の両方が演繹された
と言えます。foo
T
make_foo
v
T
U
だから私の質問は2つあります:
- 私の例のように、呼び出し元によってユニバーサル参照コンテキスト内で推定され
foo
た限られたケースで、コンストラクターへの引数をユニバーサル参照であると考えるのは理にかなっていますか?T
- 私の例では、両方とも
std::forward
賢明な使用ですか?
c++ - 一般的なラムダで「auto&&」を完全に転送する方法は?
C++14 は汎用ラムダをサポートしています。ただし、次のコードは clang 3.4 で拒否されます。
auto&&
一般的なラムダで完全に転送する方法は?
c++ - std::tuple の値を引数として使用して関数を呼び出す方法は?
私が欲しいのは、実装方法とf(magic_xxx(t))
同等にするf(1, 2)
ことです?
c++ - 移動セマンティクスと完全転送の違い
この質問から、移動セマンティクスとは何かを既に理解しています: 移動セマンティクスとは何ですか?
しかし、移動のセマンティクスに関して、完全な転送とは何かをまだ理解していません。
誰かが簡単な英語で簡単な例を説明して、完璧な転送が何を意味するかを説明できますか?
c++ - bind を使用して可変数の引数を転送できますか?
C++14 では、任意の数の引数を完全に転送するラムダを記述できます。
を使用して同じ効果を達成する方法はありbind
ますか? によって作成された関数オブジェクトbind
は任意の数の引数を取ることを知っています。また、そのようなオブジェクトはバインドされていない引数に対して完全転送を使用することを知っていますが、bind
渡されたすべての引数に対して完全転送を使用する関数オブジェクトを作成するように指示する方法はありますか?への呼び出しにプレースホルダーがなかったとしてもbind
?
c++ - なぜ完全に転送された値 (ファンクター) を使用するのですか?
C++11 (および C++14) では、ジェネリック プログラミングを対象とする追加の言語構造と改善が導入されています。これらには次のような機能が含まれます。
- R値参照
- 参照の崩壊
- 完全転送
- 移動セマンティクス、可変個引数テンプレートなど
私はC++14 仕様の以前のドラフト(現在は更新されたテキストを含む) と§20.5.1の例のコードを閲覧していました。
オンラインはこちら[intseq.general]/2 .
質問
- 関数が転送された理由、つまりなぜ
f
ですか?apply_impl
std::forward<F>(f)(std::get...
- 関数をそのまま適用しないのはなぜ
f(std::get...
ですか?
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 &&
)
では、なぜそれが必要なのでしょうか? 外すと何が壊れますか?