バージョン間でC ++の式の型が変更されたのはなぜですか?


13

私はC ++の式のタイプを理解しようとしますが、C ++ドラフトを消化するのは非常に難しく、したがって他のリソースを好むので、読むほど混乱します。 C ++バージョン間の表現と定義が大幅に変更されています。

以下では、以下のドラフトを参照します。

  • C ++ 11 [ n3690 ](最終ドラフト)
  • C ++ 17 [ n4659 ](最終ドラフト)
  • C ++ 20 [ n4835 ](現在のドラフト)

C++11 3.10左辺値と右辺値

... prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り値の型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、trueなどのリテラルの値もprvalueです。—最後の例]

C++17 3.10左辺値と右辺値

... prvalueは、評価によってオブジェクトまたはビットフィールドを初期化するか、演算子のオペランドの値を、それが出現するコンテキストで指定されたとおりに計算する式です。

C++20 7.2.1値のカテゴリ*

... prvalueは、その評価がオブジェクトまたはビットフィールドを初期化する式、または演算子のオペランドの値を、それが出現するコンテキストまたはcv void型の式で指定されているように計算する式です。

言い回しの変更を理解し、いくつかの調整が行われますが、私にとっては定義全体が変更されます。誰かがこれを理解するのを手伝ってくれる?たとえば、prvalueがxvalueではないrvalueであるという文が削除されたのはなぜですか?または、なぜ役立つ例が削除されたのですか?


3
私はすべてバージョン固有の言語タグを禁止するためのものです。まさにこの種の質問を除いて。
curiousguy


C ++バージョン間の表現と定義が大幅に変更されることを考慮に入れないでください。」しかし、定義は実際には変更されませんでした。C ++ 11ではprvalueであったほとんどの式は、C ++ 20でもprvalueです。
Nicol Bolas、

バージョン間の「矛盾(イオン)」はどこにありますか?正確にあなたの質問は何ですか?
Galigator

1
C ++ 20の変更については申し訳ありませんが、標準の不整合に気づきました。
Maggyero

回答:


5

元のprvalue定義は単なるラベルでした。特定の右辺値(つまり、x値ではないもの)を脇に置き、それらに名前を付けました。異常なthis用法(一時的なものであるため、多かれ少なかれ)を除いて、アドレスを取得することは不可能です。そのため、特定の自由は、何も壊すことなく、それらの作成と伝播で取得できます。(「アイデンティティを持っている」のではないそれらについて最近の議論も参照してください。)

新しい定義では、prvalueは「発生を待機している」初期化であることが明示されています。ターゲットオブジェクトが特定されると、それが初期化されます。(初期化は、prvalueが構築されたときでも場所ではなく行われることに注意することが重要です。)これは、すでに一般的であった同等の最適化に基づく「必須のコピー省略」の名前によるものです。

例については、新しい値カテゴリの定義は非常に単純で、必要な例が少ないと見なされていました。xvaluesにはまだ1つあります(これは最も微妙なカテゴリです)。


あなたとコメント者に感謝します!それはほとんどそれを説明しています!
Daniel Stephens、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.