++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) です。
あなたが言うように、あまり意味のあるコードではありませんが、++aa をインクリメントしてインクリメントされた変数の値をa++生成し、変数の左辺値を生成してから a をインクリメントします (代入によって上書きされます)。a の値に代入することはできません。左辺値が必要です (これは基本的に、関連するメモリが割り当てられた値です)。