問題タブ [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++ - 右辺値参照と完全転送
&& に関するいくつかの論文を読んだことがあります。
または「r」を渡すだけで十分ですか?
c++ - make_unique と完全転送
std::make_unique
標準 C++11 ライブラリに関数テンプレートがないのはなぜですか? 私は見つける
少し冗長です。次のほうがずっといいと思いませんか?
これにより、 がnew
適切に非表示になり、タイプが 1 回だけ言及されます。
とにかく、これが私の実装の試みですmake_unique
:
コンパイルするのにかなり時間がかかりましたが、std::forward
それが正しいかどうかはわかりません。それは...ですか?とはstd::forward<Args>(args)...
どういう意味ですか? コンパイラはそれから何を作りますか?
variadic-functions - 可変個引数マクロを可変個引数テンプレート関数に変換しますか?
次の形式の可変個引数マクロを指定します。
-これを可変個引数関数テンプレートに書き直すにはどうすればよいですか?
Args
更新::&&
またはまたは何の参照タイプを宣言する方法に特に興味がありますconst&
か?
更新:FTypeは「プレーンな」関数ポインターであると想定されていることに注意してください。
c++ - コピーおよび移動する 2 つのコンストラクターの結合
現在、私のおもちゃクラス テンプレートの 1 つには、非常によく似た 2 つのコンストラクターがあります。
それらを単一のコンストラクター テンプレートに結合できますか、それともセマンティクスが何らかの形で変更されますか?
c++ - C++統一代入演算子move-semantics
編集:解決済みコメントを参照-回答なしで解決済みとしてマークする方法がわからない。
c ++ 0xでのパーフェクトフォワーディング/移動セマンティクスに関するチャンネル9のビデオを見た後、私はこれが新しい代入演算子を書くための良い方法であると信じるようになりました。
これにより、r値と定数の両方を割り当てることができます。適切なコンストラクターを使用して新しいオブジェクトを作成し、その内容を*thisと交換します。必要以上にデータがコピーされないので、これは私には聞こえます。そして、ポインタ演算は安価です。
しかし、私のコンパイラは同意しません。(g ++ 4.6)そして私はこれらのエラーを受け取ります。
私は何か間違ったことをしていますか?これは悪い習慣ですか(自分で割り当てているかどうかをテストする方法はないと思います)?コンパイラはまだ準備ができていませんか?
ありがとう
d - Dでの完全転送?
tl;dr: D で完全転送を行うにはどうすればよいですか?
リンクにはすばらしい説明がありますが、たとえば、次の方法があるとします。
bar()
の代わりにfoo()
呼び出すことができる別のメソッドを作成するにはどうすればよいfoo()
ですか?
素朴なアプローチ
、、、、メソッドの-ness、-ity 、ref
などを処理しないため、もちろん機能しません。また、r値で値を使用する方法も制限されます。in
out
inout
const
pure
nothrow
そして、これらの可能性のあるケースを処理する方法がわかりません...何かアイデアはありますか?
c++ - l値ref、r値ref、initializer_listのすべてを許可するテンプレートコンストラクターを作成するにはどうすればよいですか?
大きなシーケンスの2つのベクトルを持つクラスを設計しようとしています。
まあ、それはうまく機能しますが、vectorのmoveコンストラクターを使用しません。そこで、完全な転送でr値参照を受け入れるようにコンストラクターを変更しようとしました。
そして今、私は問題を抱えています。initializer_listを使用してインスタンスを作成しようとすると、次のようなエラーが発生しました。
std::initializer_list<double>
これはに変換できないかもしれないと思いましたstd::vector<double>
が、実際には変換可能であり、enable_if引数なしで試したときに同じエラーが発生しました。私は何かが足りないのですか?
c++ - 完全転送と std::tuple (または他のテンプレート化されたクラス)
完全な転送にはいくつかの問題があります。
私の現在の理解レベルは次のとおりです。グルー テンプレート + 右辺値参照 + std::forward と、テンプレート推定ルールが通常と同じ意味を持たない特別な魔法のモードがアクティブになりますが、完全な転送を可能にするように作られています。例 :
しかし、もし T が実際にテンプレート化されたクラスだったらどうなるでしょうか? たとえば、 std::tuple を完全転送するにはどうすればよいですか? 上記のように T&& を使用すると、タプルに含まれるオブジェクトの型情報がすべて失われます。
ただし、次のコードは機能しません。
最後の gcc スナップショットは次のように述べています。
明らかに、左辺値が右辺値参照にバインドできない一般的な非テンプレートのケースにまだいます。「完全前進モード」が発動しない
だから私は卑劣になり、自分のタプルをテンプレート template として渡そうとしました:
しかし、私はまだ同じエラーが発生します。
c++ - Why doesn't `const int ci = 2; std::forward(ci);` work and how to fix / workaround it?
Simple question, why doesn't the following work (implying a copy of ci
)?
prog.cpp: In function 'int main()':
prog.cpp:6:23: error: no matching function for call to 'forward(const int&)'
The problem manifested itself while writing some template stuff, where I have a simple holder type as follows. To avoid unnecessary copies, I use perfect forwarding where possible, but that turns out to be the root of the problem it seems.
If any further information is needed, please let me know.
Any idea to circumvent this problem is greatly appreciated.
c++ - 完全な転送機能をテンプレート化する必要があるのはなぜですか?
次のコードが有効な理由:
だがしかし:
例 2 の左辺値が例 1 と同じ方法で解決されないのはなぜですか?
また、なぜ標準は引数の型を単純に推測するのではなく、 std::forward で引数の型を提供する必要があると感じているのでしょうか? タイプに関係なく、単に前に呼び出すことは意図を示しています。
これが標準的なものではなく、単なる私のコンパイラである場合、私は msvc10 を使用しています。
ありがとう
編集 1: リテラル "Hello World" を std::string("Hello World") に変更して右辺値を作成しました。