++a = b
操作はエラーを表示していませんが、a++ = b
でコンパイル中にエラーを表示していg++
ます。両方の変数は、これらの操作の前に初期化されます。
これらの操作には実際的な使用法はありませんが、コンパイル中に両方とも同じエラーが発生するはずです。どう思いますか?正当な理由がある場合は、親切に説明してください。前もって感謝します!:)
PSgcc
はこれらの両方でエラーを出します。
pre/post-increment の宣言がどのように見えるか見てみましょう ( http://en.cppreference.com/w/cpp/language/operator_incdec ):
++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);
答えはわかりました。preInc は参照を返すので、「=」演算子を使用して「a」変数をオーバーライドできます。
結果++a
はLvalueですが、結果はa++
Rvalueです。 Rvalueに何も割り当てることができないため、エラーが発生します。
違いは、(少し単純化すると) Lvalueは何らかのオブジェクトを参照する式であるのに対し、Rvalueはメモリ内のどこかに格納されたデータを参照することです。
a++
の結果が であるとしましょう7
。基本的に、書くときは、明らかに不可能なa++ = b;
割り当てb
を試みています。一方、7
と書くと、インクリメントの結果はを参照する左辺値になるので、代入は有効になります。++a = b;
a
左辺値と右辺値 の詳細については、こちらを参照してください。
++a
は左辺値(インクリメントa
して新しい値を「返す」)、a++
右辺値(インクリメントa
して古い値の一時値を「返す」a
) です。
あなたが言うように、あまり意味のあるコードではありませんが、++a
a をインクリメントしてインクリメントされた変数の値をa++
生成し、変数の左辺値を生成してから a をインクリメントします (代入によって上書きされます)。a の値に代入することはできません。左辺値が必要です (これは基本的に、関連するメモリが割り当てられた値です)。