問題タブ [universal-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++ - T const& または T&& を使用するかどうか
一般に、C++11 以降のテンプレート化された関数パラメーターに対して、従来の T const& (左辺値参照) の代わりに T&& (ユニバーサル参照) を使用するかどうか、興味があります。私が特に興味を持っているのは、右辺値の参照も処理したい場合に const を失うことを余儀なくされるという事実をどのように回避するかです。これを回避する方法はありますか?
c++ - 変更できないユニバーサル参照関数テンプレートを使用した C++ オーバーロードの解決
コードのどこかに、変更できないfooユニバーサル参照パラメーターを持つ関数があるとします。
ここfooで、特定の classをオーバーロードし、オーバーロードAの修飾子と参照型Aが呼び出されるようにします。このために、考えられるすべての資格に対して力ずくでオーバーロードを提供できます (volatile今は無視してください)。
デモ。ただし、これはより多くのパラメーターに対して非常にうまくスケーリングしません。
または、値で渡すこともできます。これは、以前のすべてのケースもキャプチャしているようです。
デモ。ただし、大きなオブジェクトをコピーする必要があります(少なくとも原則として)。
これらの問題を回避するエレガントな方法はありますか?
汎用参照関数は変更できないので、SFINAE などはありえないことを覚えておいてください。
c++ - ユニバーサル参照の左辺値/右辺値 -nes エンコーディング
私はEffective Modern C++を読んでいて、次のことが私の注意を引きました:
項目 28 で、スコットは次のように書いています。
一緒に、ユニバーサル参照と左辺値/右辺値エンコーディングに関するこれらの観察は、このテンプレートの
template<typename T> void func(T&& param);推定されたテンプレート パラメーター T は、param に渡された引数が左辺値か右辺値かをエンコードします。エンコードのメカニズムは単純です。左辺値が引数として渡されると、T は左辺値参照であると推定されます。右辺値が渡されると、T は非参照であると推定されます。(非対称性に注意してください。左辺値は左辺値参照としてエンコードされますが、右辺値は非参照としてエンコードされます。)
そのようなエンコーディングメカニズムが選択された理由を誰かが説明できますか?
つまり、右辺値を使用して前述のテンプレートを使用すると右辺値参照が生成されるよりも、参照の折りたたみ規則に従うかどうかを意味します。そして、右辺値参照として推定された場合、すべてが同じように機能すると私が知る限り。非参照としてエンコードされるのはなぜですか?
c++ - 関数に const 以外の左辺値のみを受け入れるようにする
最初のベクトルを順序付け基準として 2 つのベクトルを並べ替える関数があります。その署名は
問題は、普遍的な参照が次のようなナンセンスなケースを許可することです
右辺値は後で破棄されます(ナンセンス)。
左辺値を明示的に求めることは機能しません。
何らかの理由で、上記はコンパイルされます (右辺値にバインドして寿命を延ばすことができるのは const 左辺値だけだと思いましたか?)。
左辺値参照に追加constすると、関数はベクトルを変更して並べ替えることができなくなります。
私の質問は次のとおりです。
1) でマークされた例で、// (*)偶数ではない左辺値に右辺値をバインドできるのはなぜconstですか? 代わりに、次のようなものint& r = 20;が許可されないのはなぜですか?違いは何ですか?
2) 問題を解決するにはどうすればよいですか。つまり、関数が左辺値のみを受け入れ、右辺値の一時変数を受け入れないようにすることはできますか? (もちろん可能であれば)
明らかに、利用可能なすべての C++ バージョンを使用することが許可されています