問題タブ [rvalue-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++ - RValue 参照、ポインター、およびコピー コンストラクター
次のコードを検討してください。
Foo::bar(T&& t)
私の質問は、3 番目のオーバーロードがプログラムをクラッシュさせるのはなぜですか? ここで正確に何が起こっているのですか?t
関数が戻った後、パラメーターは破棄されますか?
T
さらに、テンプレート パラメーターが、非常にコストのかかるコピー コンストラクターを持つ非常に大きなオブジェクトであると仮定しましょう。Foo::ptr
このポインターに直接アクセスしてコピーを作成せずに、RValue 参照を使用して割り当てる方法はありますか?
c++ - C++での一時的な呼び出しの連鎖
文字列を変換するクラスがあります。
だから私はサブクラスを作成することができます
そして、変換を使用できます。
このためのより良いデザインはありますか?可能であれば動的allocation/shared_ptrの使用を避けたいのですが、通話中に一時的なものが存続するかどうかはわかりません。また、破壊中にそれぞれが親と会話できるようにしたいtranser
ので、一時的なものも正しい順序で破壊する必要があります。連鎖変換を作成して後で使用するために保存することも困難です。
もはや存在しない一時的なものへのポインタを保存します。のようなことをする
安全ですが、迷惑です。このような連鎖操作を行うためのより良い方法はありますか?
c++ - 例外のグッドプラクティスのキャッチについて
私はC++11で小さなプログラムを書いていて、実際に初めて例外を使用しています。
例外を効率的にキャッチする方法について質問がありますが、グーグルで調べても答えがわかりません。
ここに質問があります:(const?)左辺値参照または(const?)右辺値参照によって例外をキャッチすることの間でより効率的な(または推奨される)ものは何ですか?
コードでこれは与える:
1)
2)
3)
4)
c++ - 右辺値参照の const 左辺値参照を明示的に受け入れるメソッドをオーバーロードする必要がありますか?
現在、私は右辺値参照 (C++11、gnu++x0 を使用した g++) をいじっていますが、クラスに移動セマンティクスを実装したいと考えています。
右辺値参照の恩恵を受けるには、通常は const 左辺値参照を受け入れる各関数をオーバーロードする必要がありますか?
これが私のサンプルクラスだとしましょう:
セッターを右辺値参照で使用し、不要なコピーを削除したいと考えています。
このようにすべてのメソッドをオーバーロードする必要は本当にありますか?
これは私には非常に冗長に思えます。これを簡単に実装する方法はありますか?
ありがとう!
(私はスタックオーバーフローをよく読んでいますが、これは私の最初の質問です。何か間違ったことをしている場合はヒントを教えてください。)
c++ - C ++:技術レベル(ASM)でのR値参照とは何ですか?
重複の可能性:
r値参照とl値参照の違いは何ですか?(CodeGen)
疑問に思っていたのですが、技術レベルでR値の参照が何であるかを誰かが説明できますか?つまり、R値参照が作成されたときにアセンブラレベルで何が起こるかということです。
内部で何が起こるかを確認するための小さなテストとして、次のコードを記述しました。
'c'へのR値参照を作成することは意味がないことは知っていますが、テストのために、とにかくそれが何をするかを確認するために作成しました。結果は次のとおりです。
私はasmの専門家ではありませんが、この場合、「c3」は最終的に「c」への通常の参照であるように見えます。
R-Value参照を一時(char && c3 = 255)に直接バインドすると、アセンブラの最後のビットは次のように変更されます。
この変更の外観から、c3はまだ実際には値255を保持するメモリ位置への参照であると思います。したがって、これは通常の参照です。値はc3にコピー/割り当てられません。これは本当ですか?
私の仮定が正しいのか、それとも私が完全に軌道に乗っていないのか、誰かが言うことができますか?これまで、解像度の呼び出しに関しては、関数/メソッドのシグネチャ(おそらくmove-ctor)と一致するR値参照を常に考えていたため、コーダーは(move-ctorに対して)提供されたデータの処理方法を知っています。データをコピーするのではなく移動することになります)。
私が今提示したこのかなりばかげた試みを守るために、私はasmレベルでコードをいじくり回すつもりはありません。ただ、R値参照がここ数年の残りの部分と比較してどのような技術的な違いをもたらしたかを理解したいと思います。
どんな洞察や説明も大歓迎です!
ありがとう!
c++ - C++ で返された計算値を実装する最も効率的な方法は何ですか?
戻り値の最適化に加えて右辺値参照の出現により、このようなコア関数を実装する最も効率的な方法は何でしょうか? この実装を改善するにはどうすればよいですか、それともそのままにしておくべきですか?
明らかに、可能であれば、メモリのコピーまたは割り当てを避けたいと考えています。ティア。
編集:その詳細な回答については、D.ロドリゲスに感謝します。さて、私の質問の 2 番目の部分があります。これを改善する方法はありますか?
もちろん、できれば MACRO は避けたいのですが、上記のテンプレート コードをコピー アンド ペーストして ss.str().c_str() と const char* を返すと、一時的なものは十分長くは生きられません。コードは実行されているように見えますが、valgrind は文句を言います (赤信号)。
上記の to_cstr() の MACRO よりもクリーンなソリューションを思いつくことができませんでした。改善する方法はありますか、それとも放っておくべきですか?
- ケン
string - C++ 文字列構築におけるムーブ セマンティクスと R 値参照
C++11 は、次のような引数文字列構造のセマンティクスと右辺値参照を移動しますか?
たとえば、仮定宣言
の冗長なヒープコピーを防止できるようにし"abc"
ます。
もしそうなら、それは不必要にconst char
ラッパーboost::cref
を利用しboost::const_string
ますか?
c++ - コンストラクターに渡す優先パラメーター
コンストラクターパラメーターを渡すための推奨される方法はありますか?特に、これらのコンストラクターパラメーターを使用してメンバー変数を初期化する場合。
簡略化した例。
オプションは次のとおりです。
- 値渡し、次に
std::move
オブジェクトをメンバーに渡します。 const&
、次にパラメータをメンバーにコピーします。&&
、次に、パラメーターを使用してメンバーを初期化します。
デフォルト/優先パラメータの受け渡しスタイルはどうあるべきですか?
異なるパラメータタイプで変化しますか?
私の直感では、右辺値参照を使用すると言っていますが、すべての長所と短所を理解しているかどうかはわかりません。
c++ - 非const左辺値がconst左辺値参照ではなく右辺値参照に解決されないようにする
const参照、または右辺値の場合は右辺値参照のいずれかによって値を取得するために関数をオーバーロードするのに問題があります。問題は、私の非定数左辺値が関数の右辺値バージョンにバインドされていることです。私はVC2010でこれを行っています。
優先順位はfoo(x)を次のように推測することのようです
それ以外の
右辺値参照バージョンを次のように置き換えてみました
しかし、これはすべてをconst-lvalue参照バージョンに解決させる効果しかありませんでした。
この動作を防ぐにはどうすればよいですか?そして、なぜこれがデフォルトなのか-右辺値参照の変更が許可されていることを考えると非常に危険なようです。これにより、予期せず変更されたローカル変数が残ります。
編集:関数の非テンプレートバージョンを追加しただけで、期待どおりに機能します。関数をテンプレートにすると、過負荷解決ルールが変更されますか?それは..本当にイライラします!
c++ - テンプレートの右辺値参照パラメーターを右辺値参照のみにバインドする方法は?
私はネットワークライブラリを作成しており、ファイル記述子の所有権を処理するために移動セマンティクスを多用しています。私のクラスの1つは、他の種類のファイル記述子ラッパーを受け取り、所有権を取得したいと考えているので、次のようになります。
複数の無関係な型を処理する必要があるため、receive_ownershipはテンプレートである必要があります。安全のために、右辺値参照にのみバインドすることを望みます。これにより、ユーザーは左辺値を渡すときにstd::moveを明示的に指定する必要があります。
receive_ownership(std::move(some_lvalue));
ただし、問題は次のとおりです。C++テンプレートの推定により、余分な労力をかけずに左辺値を渡すことができます。そして、私は実際に、誤って左辺値をreceive_ownershipに渡し、後でその左辺値(クリア済み)を使用することによって、自分自身を一度撃ちました。
だからここに質問があります:テンプレートを右辺値参照にのみバインドする方法は?