問題タブ [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.

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

c++ - エラー C2783: '_Ty &&std::forward(remove_reference<_Ty>::type &&) throw()': '_Ty' のテンプレート引数を推測できませんでした

次のようなプッシュ関数を持つ同時キューのテンプレート化された実装があります。

後で、インスタンス化して次のように使用します。

次に、アイテムをキューにプッシュしようとすると、前述のコンパイラ エラーが発生します。

std::functionオブジェクトを格納するスレッドプール実装の一部として、以前にキューを正常に使用しました。この場合、型を推測できない理由がわかりません。何かご意見は?

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

c++ - void foo(T && param)のユニバーサル参照

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

c++ - std::move が前方参照を取るのはなぜですか?

の実装はstd::move基本的に次のようになります。

のパラメーターstd::moveはユニバーサル参照 (転送参照とも呼ばれますが、ここでは転送しません) であることに注意してください。つまり、std::move左辺値と右辺値の両方を使用できます。

しかし、全体のポイントはstd::move右辺値にキャストすることなので、なぜ右辺値にキャストできるのstd::moveでしょうか? std::move左辺値のみを受け入れるとしたら、もっと理にかなっているのではないでしょうか?

その場合、無意味な式std::move(b + c)によってコンパイル エラーが発生します。

上記の の実装はstd::move、コードが見た目とまったく同じように動作するため、初心者にとってははるかに理解しやすいでしょう: 左辺値を取り、右辺値を返します。ユニバーサル参照、参照の折りたたみ、およびメタ関数を理解する必要はありません。

では、なぜstd::move左辺値と右辺値の両方を取るように設計されたのでしょうか?

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

c++ - ID エイリアス テンプレートを転送参照にすることはできますか?

以下のスニペットを検討してください。

iは左辺値であるためfoo、転送参照パラメーターを宣言する場合は、コンパイルする必要があります。ただし、identity<T>&&が になるとint&&、代わりにエラーが発生します。

コードは GCC 6.0.0 ( demo )でコンパイルされます。

Clang 3.7.0 ( demo ) でのコードのコンパイルに失敗し、次のエラー メッセージが表示されます。

どちらが正しいですか?

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

c++ - 関数呼び出しを std::forward する必要があるのはいつですか?

私が『 Effective Modern C++』で見たコード スニペットには、関数 timerを作成するインストルメンテーションの理論的根拠の巧妙な実装があります。

私の質問はstd::forward<decltype(func)>(func)(...

  • 私の理解では、実際には関数を元の型にキャストしていますが、なぜこれが必要なのですか? 簡単な呼び出しでうまくいくようです。
  • 関数呼び出しを行うために完全転送を使用する他のケースはありますか?

これは、タイマー型をコンパイル時の定数にしたい場合に備えて、ラムダ式で使い慣れたテンプレート構文を使用するための良い使用例のように見えます。