問題タブ [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++ - ユニバーサルリファレンス経由で渡された関数の std::forward ?
次の 2 つを検討してください。
と
どのような場合に違いがあり、具体的にどのような違いがあるのでしょうか?
c++ - ユニバーサル参照からのテンプレート引数を const ref として使用する
私の実際のユースケースはさらにいくつかの引数を取りますが、これは次のように単純化されます:
それだけで、Arg1 が何らかの形で崩壊し、何らかの参照になる可能性が高いことは明らかです。p1 はアルゴリズムの出力でもあるため、呼び出し元が左辺値を渡すことを選択した場合、関数は中断した場所を反映するように変更された元のパラメーターで戻ります。
ただし、p2 は同じタイプですが、変更されることはありません。したがって、実際には、正確さのために「const」プロミスを入れたいと思います。明らかに、Arg1 が参照であると推測される場合、それに const を追加することはできません。
だから私の解決策はこれです:
これは、いくつかの修飾子を削除してから const& を元に戻すために、ばかげた策略の束を通過します。
だから私の質問は:
1) これが最善の方法ですか?
2) これが失敗するコンテキストはありますか? 今のところ、それは私にはかなり良いようです。
c++ - ユニバーサル リファレンスの適切な使用
C++11 より前は、次のようなコードを書いていました。
しかし、移動セマンティクスを使用すると、(少なくとも場合によっては) 関数が右辺値参照をパラメーターとして取り、これらのオーバーロードを追加できるようになる可能性があります。
私が集めたものから、大きな関数内でこれらのオーバーロードを呼び出せるようにしたい場合は、次のように見える完全な転送を使用する必要があります (少し読みにくいですが、テンプレート タイプの適切な命名規則):
私の問題はこれです:私の小さな関数に他のオーバーロードがある場合、意図されていない型のパラメーターを使用して大きな関数を呼び出すことが可能になるということではありませんか?
これを防ぐためにこれが機能する可能性があると思います:
A、B、または C に暗黙的に変換可能な型で大きな関数を呼び出そうとすると、どのように動作するかがわからないため、制限が厳しすぎるかどうかはわかりませんが...
でも... これでうまくいくとしても、本当に他に選択肢がないのでしょうか? (というか…目に優しくない)
c++ - これは普遍的な参照ですか?ここで std::forward は意味がありますか?
次のコード スニペットを考えてみましょう。これは、推定される型に特化したクラス テンプレートのインスタンスを関数テンプレートに構築させるという一般的なイディオムを使用しています。たとえば、std::make_unique
andstd::make_tuple
で見られます。
Scott Meyers の「ユニバーサル リファレンス」のコンテキストでは、引数 to
はmake_foo
ユニバーサル リファレンスです。のコンストラクターへの引数は、その型は ですが、(一般に) 推定されないため、ユニバーサル参照ではありません。U&&
U
foo
T&&
T
しかし、 のコンストラクターがfoo
によって呼び出される場合、 のコンストラクターへの引数をユニバーサル参照であるmake_foo
と考えるのは理にかなっているように思えます。関数 template によって推定されているからです。の型が両方の関数で同じになるように、同じ参照折りたたみルールが適用されます。この場合、 と の両方が演繹された
と言えます。foo
T
make_foo
v
T
U
だから私の質問は2つあります:
- 私の例のように、呼び出し元によってユニバーサル参照コンテキスト内で推定され
foo
た限られたケースで、コンストラクターへの引数をユニバーサル参照であると考えるのは理にかなっていますか?T
- 私の例では、両方とも
std::forward
賢明な使用ですか?
c++ - コンストラクターでの C++ ユニバーサル参照と戻り値の最適化 (rvo)
ユニバーサル参照引数を持つコンストラクターを持つクラスで右辺値の最適化が行われないのはなぜですか?
http://coliru.stacked-crooked.com/a/672f10c129fe29a0
出力:
c++ - ユニバーサル リファレンスなしで、ユニバーサル リファレンスの利点を得る
問題
func
フォーム内の任意のコンテナー(Container<Type, N, Args...>
つまり、最初のテンプレート引数として型を取り、2 番目としてstd::size_t
コンテナー内にいくつの引数があるかを定義するコンテナー)を取りi
、N
が40
と42
.
そのようなコンテナの例はstd::array
.
関数の最初のバージョンは次のようになります。
そして、const
オーバーロードが必要になります:
質問
次のようなものを定義することは可能ですか (これは普遍的な参照ではないため、機能しません):
この関数の単一バージョンを定義し、make はContainer<Type, N, Args...>&
とconst Container<Type, N, Args...>&
?の両方で機能します。