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

0 投票する
4 に答える
564 参照

c++ - 次のC++標準で登場しようとしているR値参照とは何ですか?

次のC++標準で登場しようとしているR値参照とは何ですか?

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

c++ - 戻り値はc ++ 0xで右辺値参照によって渡されますか?

関数があるとしましょう:

C++0x は、偽のコピーが randomVector の戻り値から回避されると具体的に言っていますか? それとも、コンパイラは RVO を実装する必要がありますか? 値randomVector()を右辺値として扱う必要があるため、v の移動コンストラクターを呼び出す必要があるように思えますが、これが正しいかどうかは完全にはわかりません。

0 投票する
4 に答える
4458 参照

c++ - C++ の「移動元」コンテナ

std::moveC++11 では、値をコンテナーに移動 (破壊的にコピー) したいときに を使用することで、効率を高めることができます。

しかし、私はそれ以外の方法を見つけることができません。つまり、次のようなものです。

これは、アダプタのようなものでより頻繁に (コピーポップ) 発生しstackます。このようなものが存在する可能性があります:

コピーを避けるには?そして、これはすでに存在しますか?n3000ではそのようなものは見つかりませんでした。

私は痛ましいほど明白な何か (その不必要性など) を見逃していると感じているので、「ru dum」の準備ができています。:3

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

c++ - 非クラスの右辺値は常に cv 修飾されていない型を持ちます

§3.10 セクション 9 は、「非クラスの右辺値には常に cv 修飾されていない型がある」と述べています。それは私を驚かせました...

標準によると、非クラス型の const 右辺値などはありませんbar()が、 にバインドすることを好みconst int&&ます。これはコンパイラのバグですか?

EDIT:どうやら、thisconst rvalueでもあります:)

編集: この問題は g++ 4.5.0 で修正されたようです。両方の行で "rvalue" が出力されるようになりました。

0 投票する
3 に答える
1609 参照

c++ - 右辺値参照に関するいくつかの明確化

最初: と はどこにstd::move定義std::forwardされていますか? それらが何をするかは知っていますが、それらを含めるために標準ヘッダーが必要であるという証拠を見つけることができません。gcc44std::moveでは、利用できる場合と利用できない場合があるため、明確な include ディレクティブが役立ちます。

移動セマンティクスを実装する場合、ソースはおそらく未定義の状態のままになります。この状態は、オブジェクトの有効な状態である必要がありますか? 明らかに、オブジェクトのデストラクタを呼び出すことができる必要があり、クラスが公開する手段によってオブジェクトを代入できる必要があります。しかし、他の操作は有効である必要がありますか? 私が求めているのは、クラスが特定の不変条件を保証している場合、ユーザーがそれらを気にしないと言ったときに、それらの不変条件を強制するように努力する必要があると思いますか?

次: 移動セマンティクスを気にしない場合、関数パラメーターを処理するときに右辺値参照よりも非 const 参照が優先される原因となる制限はありますか? void function(T&);呼び出し元のvoid function(T&&);観点からは、関数に一時的な値を渡すことができると便利な場合があるため、実行可能な場合はいつでもそのオプションを許可する必要があるようです。また、右辺値参照はそれ自体が左辺値であるため、誤ってコピー コンストラクターの代わりにムーブ コンストラクターなどを呼び出すことはできません。マイナス面は見当たりませんが、マイナス面があることは確かです。

それが私の最後の質問につながります。一時変数を非 const 参照にバインドすることはまだできません。ただし、それらを非 const 右辺値参照にバインドできます。そして、その参照を別の関数で非 const 参照として渡すことができます。

何もしないという事実に加えて、そのコードに何か問題がありますか? 右辺値参照を変更することは、それらの存在の全体的なポイントであるため、私の直感はもちろんそうではありません。そして、渡された値が正当に const である場合、コンパイラはそれをキャッチして怒鳴ります。しかしどう見ても、これは何らかの理由で導入されたと思われる仕組みの回避策であるため、私が愚かなことをしていないことを確認したいと思います。

0 投票する
3 に答える
812 参照

c++ - VC++2010の「移動可能のみのタイプ」に関する問題

最近、Visual Studio 2010 Professional RCをインストールして、VC++2010に実装されているいくつかのC++0x機能を試してテストしました。

のを問題なくインスタンス化しましたstd::vectorstd::unique_ptrただし、一時をに渡してデータを設定しようとするとpush_back、コンパイラはのコピーコンストラクタunique_ptrがプライベートであると文句を言います。左辺値を動かして挿入してみましたが、問題なく動作します。

結局のところ、問題は、次のコードで示されているように、右辺値を処理するときにVC++が過負荷を解決する方法でもありませunique_ptrん。vector::push_back

コンパイラは、コピーコンストラクタにアクセスできないと文句を言います。公開すると、プログラムがコンパイルされます(コピーコンストラクターが定義されていなくても)。

右辺値参照について何か誤解しましたか、それともこの機能のVC ++ 2010実装の(おそらく既知の)バグですか?

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

c++ - unique_ptr を含むこのコードをコンパイルするにはどうすればよいですか?

コンパイルされません...(unique_ptrのコピーコンストラクタが削除されていると言います)

move を forward に置き換えてみました。うまくいったかどうかはわかりませんが、うまくいきませんでした。


0 投票する
4 に答える
1539 参照

c++ - 新しい c++0x 右辺値参照演算子のオーバーロードを追加するときに冗長コードを減らす方法

c++0x の右辺値参照を利用するために新しい演算子のオーバーロードを追加していますが、多くの冗長なコードを生成しているように感じます。

treedouble 値に対する代数演算のツリーを保持するクラス があります。使用例を次に示します。

各二項演算 (plus など) では、各辺は lvalue tree、 rvalue tree、またはのいずれかになりますdouble。これにより、2 項演算ごとに 8 つのオーバーロードが発生します。

また、バイナリ演算 (マイナス、乗算、除算など) ごとに繰り返す必要があります。

ご覧のとおり、実際に記述する必要がある関数は 4 つだけです。他の 4 つはキャストしてコア ケースに転送できます。

このコードのサイズを小さくするための提案はありますか?

PS:このクラスは実際には単なる double のツリーよりも複雑です。コピーを減らすと、プロジェクトのパフォーマンスが劇的に向上します。したがって、余分なコードがあっても、右辺値のオーバーロードは私にとって価値があります。上記の「キャストアンドフォワード」のケースをテンプレート化する方法があるのではないかと疑っていますが、何も考えられないようです。

0 投票する
6 に答える
3067 参照

c++ - C++0x 右辺値参照と一時変数

(comp.std.c++ でこの質問のバリエーションを尋ねましたが、回答が得られませんでした。)

f(arg)このコードの への呼び出しが の const ref オーバーロードを呼び出すのはなぜfですか?

私の直感は、f(string &&)オーバーロードを選択する必要があることを示しています。なぜならarg、一時的なものに変換する必要があり、一時的なものは左辺値の参照よりも右辺値の参照によく一致するからです。

これはGCC とMSVC では発生しません (編集: Sumant に感謝: GCC 4.3-4.5 では発生しません)。少なくともG++ とMSVC では、作成された中間の一時変数がある場合でも、左辺値は右辺値参照引数にバインドされません。実際、const ref オーバーロードが存在しない場合、コンパイラはエラーを診断します。f(arg + 0) ただし、 orを書くと、期待どおりに右辺値参照のオーバーロードf(std::string(arg)) が選択されます。

f(string &&)C++0x 標準を読んだところ、const lvalue ref 引数を渡すときと同様に、実行可能かどうかを検討するときに、const char * から文字列への暗黙的な変換を考慮する必要があるようです。セクション 13.3 (オーバーロードの解決) では、あまりにも多くの場所で右辺値参照と const 参照を区別していません。また、中間の一時がある場合、左辺値が右辺値参照 (13.3.3.1.4/3) にバインドされないようにする規則は適用されないようです。結局のところ、一時から移動することは完全に安全です。

これは:

  1. 実装された動作が意図された動作である標準を誤解/誤解していますが、私の例がそのように動作する正当な理由がありますか?
  2. コンパイラベンダーが何らかの形で犯した間違いですか? それとも、一般的な実装戦略に基づく間違いですか? または、他のベンダーによってコピーされた、たとえば GCC (この左辺値/右辺値参照バインディング規則が最初に実装された場所) の間違いですか?
  3. 標準の欠陥、または意図しない結果、または明確にする必要があるものはありますか?

編集: 関連する追加の質問があります: C++0x 右辺値参照 - 左辺値-右辺値バインディング