問題タブ [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++ - std::bind()、可変個引数テンプレート、および完全転送を組み合わせる方法は?
サードパーティ関数を介して、別のメソッドからメソッドを呼び出したい。ただし、両方とも可変個のテンプレートを使用します。例えば:
問題は、コンパイル エラーが発生することです。
ラムダを使用してみましたが、GCC 4.8 はまだ構文を処理していない可能性があります。ここに私が試したものがあります:
次のエラーが表示されます。
私が理解していることから、コンパイラはinvoke_impl
typeでインスタンス化することを望んでいますが、この場合に使用すると実際の引数の型が保持されるint&&
と思いました。&&
私は何を間違っていますか?ありがとう、
c++ - 静的にオプションの値を保存する方法
他の関数をラップするが、ラップされた呼び出しの後に何かを行う関数を考えてみましょう。
これを拡張して、返す関数をラップする方法はvoid
? 別の専門分野を追加するのは簡単ですが、慣用的な別の方法を探しています。
一般的な考え方は、値がある場合とない場合があるということです。コンパイル時のようなものoptional
です。
c++ - 参照の折りたたみルールが必要な理由
誰もが知っているかもしれませんが、右辺値参照を参照折りたたみルールと組み合わせて使用して、次のように完全な転送関数を構築しています。
参照折りたたみルールは次のようになります
したがって、私の例f
では、T
isint&&
とT&&
is がint&& &&
に折りたたまれint&&
ます。
T
私の質問は、が既に推定されている場合、なぜこれらのルールが必要なのint&&
ですか? なぜだろう
if isvoid f(int)
の代わりvoid f(int&&)
に? もしが 本当にでが であり であり、したがってである場合、参照の折りたたみルールが適用されないように見えるのに、なぜ参照の折りたたみルールが必要なのですか? これらは私の限られた知識から判断できる唯一の 2 つのオプションなので、明らかに私が知らないルールがあります。T
int&&
T
int
T&&
int&&
void f(int&&)
これについての標準からの引用を見ることも役に立ちます。
c++ - 可変個引数のテンプレート引数を複数のクラス メンバーに転送する
以下は安全ですか?最初のクラス メンバーが初期化された後は d にstd::string
なりませんか? move
正常に印刷されますが、わかりません。
の 3 番目の ctor パラメータが でC
あるため、問題ないと思いますが、r-value refをconst std::string&
取るクラスで完全な転送を防ぐにはどうすればよいですか?C(int, int, std::string&&)
m_two
m_one
Test の cactor を
コンパイルしません。std::forward<Args>(args)...
また、 fromm_one
およびm_two
ctorを削除することもありません。
c++ - ペアから unique_ptr を返せないのはなぜですか?
ペアから unique_ptr を返せないのはなぜですか?
これを g++ 4.6 でコンパイルしようとすると、次のようになります。
エラーメッセージがわかりません
c++ - std::forward は、参照が左辺値か右辺値かをどのように認識しますか?
http://www.cplusplus.com/reference/utility/forward/?kw=forwardのユーティリティ std::forward の例は、少し魔法のようです。呼び出し元の関数の引数が左辺値か右辺値かをどのように知るのでしょうか? これはコンパイラによって決定されますか、それとも実行時に決定されますか? ここでわからないことがあると思いますが、きちんと質問できるほど知っているかどうかわかりません。std::forward が「フードの下で」行うことについて、誰かが少し説明できますか。
c++ - パラメータの受け渡しでの std::forward の使用法は何ですか?
以下のコードを参照してください (s は、string ではなく char を持つ配列であることに注意してください)。
func(s, ':')
usingを置き換えても違いはありません。この場合std::forward
、foo 関数はなしで完全な転送を行います。std::forward
std::forward
C++11での「prefect forwarding」の誤解はありますか?