0

次のコードを検討してください。

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 がこの一時的なものをオペレーター コンテキストで強制的に定数にするのはなぜですか? これは正しい動作ですか?

4

1 に答える 1

3
A();

一時的に作成します。

A& operator+=( A& a, int i ) { return a; }

temporary を にバインドすることはできませんreference。これは非標準の拡張であるため、MSVC はこれを受け入れます。右辺値から左辺値への変換 Visual Studio を見てください

于 2012-09-24T20:59:35.400 に答える