問題

lvalueとrvalueを学ぶ。定義は、 "address of"になることができるものは左の値であり、そうでなければrvalueです。

演算子の優先順位を確認しました。接頭辞と後置インクリメントの両方が "address of"演算子より優先されます。

以下の2つの例では、最初の "&++ value1"がlvalueであり、2番目の "& value1 ++"がrvalueである理由を説明できます。

どちらの場合も間違った理解は次のとおりです。pValue1はvalue1変数を指しています。アドレス相関が構築される前または後にvalue1が8に変更されても、value1変数は常に1つのメモリ位置を占有し、そのアドレスを導出できます。

 int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;
 

  ベストアンサー

私のコメントに基づいて、コンパイラがなぜこの種の操作に反対しているのかを見ることができます。問題は、オブジェクト(この場合はint)をコピーするpostfix operator ++の一般的な実装にあり、元のものをインクリメントし、そのプリインクリメントされたコピーを返します。次のように定義された関数のように考えることができます:

 int foo_operator(int& a)
{
    int copy = a;
    a += 1;
    return copy;
}
 

あなたの例でその関数を使用しようとすると、あなたのコンパイラもそれに抗議します。その関数の戻り値はrvalueです。

あなたは今尋ねるかもしれません - 接頭辞operator ++はどうですか?それも値を返す関数ではありませんか?答えは - いいえ。接頭辞operator ++はコピーされた値ではなく参照を返します。したがって、その「結果」はオペランド&で使用できます。

  同じタグがついた質問を見る

c++rvaluelvalue