を追加しない何..私は特に二つの違いを理解しようとしてきたXvalues:IDプロパティが、それはすべてのこれらの詳細は、しっかりと相互接続されているだけのことだ、私は質問の広ごめんなさい
値のカテゴリ - xvaluesとprvalues、しかし私はまだ混乱しています。
(prvalueからはxValue違う)アイデンティティSO上で、次の質問で説明されたのプロパティ:定義のためのすべての
Is it correct to say that xvalues have identity and are movable?
まず、受け入れ答えは、引用§5/ 7 xvalueの; cppreference(と私が知っているようにコンパイラによると)では、最初の式はgeneric rvalueである可能性がありますが、必ずしもそうではありません。 xvalue。 ここでどのソースが正しいのですか?
とにかく、私が「アイデンティティ」の概念のために自分自身で開発しようとした精神モデルは、それを持つ表現が実際のプログラムのデータメモリに存在することが保証されるべきであるということです。
このように、文字列リテラルは左辺値であり、プログラム実行全体でメモリに常駐することが保証されますが、数値リテラルはprvaluesです。仮想的に真っ直ぐなasmに格納される。
同じことがfun(1)
を呼び出すときに、我々は呼び出し先のフレームにのみパラメータ左辺値になるだろう、すなわち、prvalueリテラルからstd::move
に適用するようだが、fun(std::move(1))
を呼び出すときglvalueのはxValue「種類」は、呼び出し元のフレーム内に保持されなければなりません。
しかし、このメンタルモデルは少なくとも私が理解するように、常に実際のメモリに作成されるべき一時的なオブジェクトでは機能しません(例えば、rvalue-ref-taking funcがprvalue引数を持つfun(MyClass())
)。だから私はこの精神モデルが間違っていると思います。
xvaluesの 'identity'プロパティについて考える正しい方法は何でしょうか?私はアイデンティティでそれを読んだが、私はアドレスを比較することができますが、2 MyClass().member
(xvalueはcppreferenceに従って)のアドレスを比較できる場合は、rvalue refをいくつかの比較関数に渡すと、なぜ私は理解できないのですか? 2 MyClass()
(prvalue)と同じことをすることはできませんか? std ::動き(a)は右辺値であっても、その評価は一時的なオブジェクトを作成できません What are move semantics?
注:これに接続して
つ以上のソースはこちらの答えです。この難題は、委員会に第3の価値カテゴリーを導入させた。 rvalue参照にバインドできるものは、従来の意味でのrvalueではないものの、xvalue(eXpiring値)と呼ばれます。
これは「アドレスを比較できる」とは関係がないように思われますが、これはrvalueの '従来の意味'とはどのように違うのか分かりません。 b)なぜそのような理由が言語の新しい価値カテゴリを必要とするのか理解できません(これは、OOの意味でオブジェクトの動的な型定義を提供できますが、xvaluesはオブジェクトを参照するだけではありません)。
新しい規則(C++ 17)では、prvaluesが再定義され、prvalue-xvalue変換「一時的なマテリアライゼーション」が導入されています。 2つのMyClass()prvaluesを比較関数に渡そうとすると、参照初期化の一部としてこの変換が行われます。 – Cubbi
@Cubbi hm、あなたはC++ 17がこの「メモリに格納されていることが保証された」コンセプトと一貫性を持たせることを意味しますか?私は思いつきましたか、または実現化の根拠は純粋にelutionでしたか?私はコンセプトがスタンダードの言葉のどこにもないことを理解していますが、外部の観点からは、物事がどのように定義されているかを実際に遵守しているようです。 – ledonter
それはより一貫しているようです、はい。 C++ 14 rvalue refは、クラスprvalueとクラスxvalue初期化子の両方に "直接"バインドします。 ([dcl.init.ref] /5.2)。今ではxvaluesに直接バインドされますが、prvaluesと結果のxvaluesにバインドされます。 – Cubbi