1

この質問は、すべての一時的な値が右辺値であるかどうかを尋ねます。

この表現を考えると、答えはノーです。

const int &ri = 2 + 3;

次に、ここでは右辺値であるまったく同じ一時(2 + 3)値を、後続の式の左辺値として使用できます。

const int *pi = &ri;

したがって、この一時的な値は(唯一の)右辺値ではありません。

その場合、論理ステートメントtemporary ==> rvalueはfalseになります。

ただし、書くことはできません

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue

また

int *i = &4; // illegal, 4 is an rvalue (literal)

また

int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue

したがって、私の質問は、一時的またはリテラルを持たずに、特定の式で右辺値を生成できるかどうかです。rvalue ==> (temporary or literal)本当ですか?

4

2 に答える 2

5

一時オブジェクトを生成する式r値です。const-referencesとr-value参照がr-valuesにバインドできるようにする特別なルールがあります。これにより、一時オブジェクトの存続期間が参照の存続期間まで延長されます(12.2(5)を参照)が、一時オブジェクトは作成されません。 -r値以下のオブジェクト式。

ただし、参照にバインドされると、参照変数自体に名前が付けられるため、参照式はl値になります。

式、変数、オブジェクトを混同しないでください。

于 2012-11-03T01:21:24.023 に答える
3

rvalue属性lvalue属性は、オブジェクトではなく式に適用されます。式は、左辺値または右辺値のいずれかになります。値を生成する式を単純化しすぎると右辺値式になり、オブジェクトを生成する式は左辺値式になります。左辺値から右辺値への変換は、オブジェクトから値を読み取る動作です。

一時値とリテラルを生成する式はどちらも右辺値式であり、実際のオブジェクトではなくを表します。

あなたの例では:

const int &ri = 2 + 3;
const int *pi = &ri;

2+3は、定数参照を初期化するために使用される右辺値式です。つまり、言語によると、一時的なものの存続期間が現在の式を超えて、参照が範囲外になるまで延長されることを意味します。その後、2番目の式では、部分式riは、有効期間が延長された一時オブジェクトを参照する左辺値式です。

一時的な右辺値式を作成する方法は他にもあることに注意してください。たとえば、参照を生成するメンバーを呼び出すなどです。

struct test {
   test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()

部分式foo()右辺値式ですが、式foo().thisTest()左辺値式です。どちらも、完全な式の最後に消える一時オブジェクトを参照しています。

于 2012-11-03T02:15:16.210 に答える