問題タブ [forwarding-reference]
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++ - エラー C2783: '_Ty &&std::forward(remove_reference<_Ty>::type &&) throw()': '_Ty' のテンプレート引数を推測できませんでした
次のようなプッシュ関数を持つ同時キューのテンプレート化された実装があります。
後で、インスタンス化して次のように使用します。
次に、アイテムをキューにプッシュしようとすると、前述のコンパイラ エラーが発生します。
std::function
オブジェクトを格納するスレッドプール実装の一部として、以前にキューを正常に使用しました。この場合、型を推測できない理由がわかりません。何かご意見は?
c++ - std::move が前方参照を取るのはなぜですか?
の実装はstd::move
基本的に次のようになります。
のパラメーターstd::move
はユニバーサル参照 (転送参照とも呼ばれますが、ここでは転送しません) であることに注意してください。つまり、std::move
左辺値と右辺値の両方を使用できます。
しかし、全体のポイントはstd::move
右辺値にキャストすることなので、なぜ右辺値にキャストできるのstd::move
でしょうか? std::move
左辺値のみを受け入れるとしたら、もっと理にかなっているのではないでしょうか?
その場合、無意味な式std::move(b + c)
によってコンパイル エラーが発生します。
上記の の実装はstd::move
、コードが見た目とまったく同じように動作するため、初心者にとってははるかに理解しやすいでしょう: 左辺値を取り、右辺値を返します。ユニバーサル参照、参照の折りたたみ、およびメタ関数を理解する必要はありません。
では、なぜstd::move
左辺値と右辺値の両方を取るように設計されたのでしょうか?
c++ - ID エイリアス テンプレートを転送参照にすることはできますか?
以下のスニペットを検討してください。
i
は左辺値であるためfoo
、転送参照パラメーターを宣言する場合は、コンパイルする必要があります。ただし、identity<T>&&
が になるとint&&
、代わりにエラーが発生します。
コードは GCC 6.0.0 ( demo )でコンパイルされます。
Clang 3.7.0 ( demo ) でのコードのコンパイルに失敗し、次のエラー メッセージが表示されます。
どちらが正しいですか?
c++ - 関数呼び出しを std::forward する必要があるのはいつですか?
私が『 Effective Modern C++』で見たコード スニペットには、関数 timerを作成するインストルメンテーションの理論的根拠の巧妙な実装があります。
私の質問はstd::forward<decltype(func)>(func)(...
- 私の理解では、実際には関数を元の型にキャストしていますが、なぜこれが必要なのですか? 簡単な呼び出しでうまくいくようです。
- 関数呼び出しを行うために完全転送を使用する他のケースはありますか?
これは、タイマー型をコンパイル時の定数にしたい場合に備えて、ラムダ式で使い慣れたテンプレート構文を使用するための良い使用例のように見えます。