次のコードを検討してください。
struct A {
A& add( int i ) { return *this; }
};
A& operator+=( A& a, int i ) { return a; }
void f() {
A a1 = A().add( 1 ); // expr 1
A a2 = A() += 1; // expr 2
}
式 1 と 2 の両方が VC で受け入れられます。式 2 は、「実行可能なオーバーロードされた '+=' はありません」という理由で GCC によって拒否されます。ただし、そのような式は、定数オブジェクトへの参照を取る演算子には受け入れられます。
const A& operator+=( const A& a, int i ) { return a; }
メソッド呼び出しコンテキストではないのに、GCC がこの一時的なものをオペレーター コンテキストで強制的に定数にするのはなぜですか? これは正しい動作ですか?