問題タブ [rvalue]
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++ - クラス、右辺値、および右辺値参照
左辺値はメモリの決定的な領域にバインドされた値ですが、右辺値は一時的な存在であり、必ずしもメモリの決定的な領域を参照するとは限らない式の値です。右辺値が予期される位置で左辺値が使用される場合は常に、コンパイラは左辺値から右辺値への変換を実行してから、評価を続行します。
http://www.eetimes.com/discussion/programming-pointers/4023341/Lvalues-and-Rvalues
一時的な (匿名の) クラス オブジェクトを構築するか、関数から一時的なクラス オブジェクトを返すときはいつでも、オブジェクトは一時的ですが、アドレス指定可能です。ただし、オブジェクトは依然として有効な右辺値です。これは、オブジェクトが a) アドレス指定可能な右辺値であるか、または b) コンパイラが左辺値の使用を想定しているときに、左辺値から右辺値に暗黙的に変換されていることを意味します。
例えば:
また、関数によって返される一時オブジェクト(次の場合) は、次のコード セグメントのように左辺値であることもわかっています。a
次の出力が得られます。
int conversion ctor
lvalue copy ctor
ret_a
実引数を使用した関数の呼び出しが、値 5 で関数の仮引数を構築A(5)
する変換コンストラクターを呼び出すことを示します。A::A(int)
a
関数の実行が完了すると、 を引数として使用して一時A
オブジェクトを作成し、 を呼び出します。ただし、オーバーロードされたコンストラクターのリストから削除した場合、返された一時オブジェクトは引き続き右辺値参照コンストラクターと一致します。a
A::A(A&)
A::A(A&)
A::A(A&&)
これは私がよく理解していないことです:オブジェクトa
が右辺値参照と左辺値参照の両方にどのように一致するのでしょうか? A::A(A&)
の方がより適切に一致することは明らかですA::A(A&&)
(したがってa
、左辺値である必要があります)。ただし、仮引数a
が左辺値である場合、右辺値参照は左辺値に初期化できないため、 への呼び出しと一致することはできませんA::A(A&&)
。コンパイラが左辺値から右辺値への変換を行っている場合、それは簡単です。'A' から 'A&' への変換も些細なことであり、両方の関数が同一の暗黙的な変換シーケンス ランクを持つ必要があるため、オーバーロードされた関数にA::A(A&)
との両方がある場合、コンパイラは最適な関数を推測できないはずです。A::A(A&&)
候補セット。
さらに、質問(以前に尋ねたもの)は次のとおりです。
特定のオブジェクトが右辺値参照と左辺値参照の両方に一致するにはどうすればよいですか?
c++ - さまざまなタイプの *-値
重複の可能性:
rvalues、lvalues、xvalues、glvalues、および prvalues とは何ですか?
右辺値、左辺値、非右辺値、非左辺値の違いは何ですか?
そのような*値の種類はいくつありますか? つまり、xvalues もあると聞きました。
これをひどく理解する必要があります。そして、これらは一時変数とラムダにどのように関連していますか?
繰り返し、困惑、矛盾した表現、冗長に聞こえたら申し訳ありません。
c++ - この右辺値呼び出しがあいまいなのはなぜですか?
この右辺値呼び出しがあいまいなのはなぜですか? 私は AA と AA& を持つことができ、コンパイラは を使用することを認識しますAA&
。しかし、3 番目のオプションを追加すると、エラーが発生します。明らかに AA&& は、int の int のような他のものよりも優れたオーバーロードであり、long よりも優れています。なぜこれがあいまいなのですか?3 つのオーバーロードすべてを保持し、どれが必要かを明確にする方法はありますか? (型キャスト(AA&&)
はそれを行いません)。
c++ - C++ 2011 で右辺値オブジェクトの const メンバー関数の呼び出しを禁止するにはどうすればよいですか?
次のコード
元のベクトルがそこですでに破壊されているため、クラッシュする可能性があります。右辺値参照が導入された後の C++ 2011 (c++0x) では、ベクトル引数が右辺値である場合、削除された関数宣言を使用して呼び出しを完全に禁止できます。at
それは良さそうに見えますが、次のコードは依然としてクラッシュを引き起こします
operator [] (size_type) const
右辺値オブジェクトのメンバー関数の呼び出しは引き続き許可されるためです。この種の呼び出しを禁止する方法はありますか?
修理:
上記の例は、私が実際のプロジェクトで行ったことではありません。C++ 2011 が次のようなメンバー関数の修飾をサポートしているかどうか疑問に思っています
修理:
それは素晴らしいことですが、C++ 標準はこの機能に行き過ぎていると思います。とにかく、clang ++ 2.9でコンパイルされた次のコードがあります
どうもありがとう!
c++ - decltype(0 + 0)とは何ですか?
(回答によって促されます。)
N3290、§7.1.6.2p4を考えると、リストアイテムには番号が付けられていませんが、便宜上、ここでは番号が付けられています。
decltype(e)で示されるタイプは、次のように定義されます。
- eが括弧で囲まれていないid式または括弧で囲まれていないクラスメンバーアクセス(5.2.5)の場合、decltype(e)はeで指定されたエンティティのタイプです。そのようなエンティティがない場合、またはeがオーバーロードされた関数のセットに名前を付けている場合、プログラムの形式は正しくありません。
- それ以外の場合、eがxvalueの場合、decltype(e)はT &&です。ここで、Tはeのタイプです。
- それ以外の場合、eが左辺値の場合、decltype(e)はT&です。ここで、Tはeのタイプです。
- それ以外の場合、decltype(e)はeのタイプです。
decltype(0 + 0)で指定されたタイプは何ですか?
項目1は適用されず、2は適用される可能性がありますが、そうでない場合、3は適用されず、4が結果になります。では、xvalueとは何ですか、そして0 + 0はxvalueですか?
§3.10p1:
xvalue(「eXpiring」値)も、通常はその存続期間の終わり近くにあるオブジェクトを参照します(たとえば、そのリソースを移動できるようにするため)。xvalueは、右辺値参照(8.3.2)を含む特定の種類の式の結果です。
§8.3.2にはここで役立つものは何もありませんが、「0+0」には右辺値参照が含まれていないことは知っています。リテラル0は、「xvalueではない右辺値」(§3.10p1)であるprvalueです。「0+0」も優先値だと思います。それが本当なら、「decltype(0 + 0)」はintになります(int &&ではありません)。
私は私の解釈で何かを逃したことがありますか?このコードは整形式ですか?
このコードは、GCC 4.7.020110427およびClang2.9(トランク126116)でコンパイルされます。たとえば、decltypeがint &&型を指定した場合、整形式ではありません。
c++ - インクリメントオペランドエラーとして必要な左辺値
何が問題になってい++(-i)
ますか?どうか明らかにしてください。
c++ - 関数パラメーターとしてのC++0xconstRValue参照
私は、なぜ誰かが定数値参照をとる関数を書くのかを理解しようとしています。
以下のコード例では、const rvalue参照関数(「3」を返す)の目的は何ですか。また、オーバーロード解決では、constLValue参照関数よりもconstRvalueが優先されるのはなぜですか(「2」を返します)。
c++11 - リテラルおよび右辺値の参照
aint
は、が呼び出されたときに作成さtest
れますか、それともC ++ではデフォルトでリテラルはint
タイプですか?
d - D の const ref と右辺値
コード
コンパイルエラー
質問:
const ref
右辺値にバインドできないのはなぜですか? 大丈夫ですか?- この問題を解決するには、戻る必要があります
ref CustomReal
か? 大丈夫ですか?const ref CustomReal
opBinary()
- スタック上に作成されたローカル オブジェクトへの参照を返すのは正しいですか?
ref CustomReal Create() { return CustomReal(0.0); }