2012-09-24 23 views
0

考慮下面的代碼:GCC恆定臨時在二元表達

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拒絕,並且「No viable overloaded'+ ='」。然而,這樣的表達接受採取引用常量對象運營商:

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

爲什麼GCC迫使這個臨時要在運營商方面不斷不用時方法調用上下文,這是正確的行爲?

+1

調高MSVC的警告水平,它會告訴你答案。 –

回答

3
A(); 

創建臨時。

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

臨時不能綁定到reference。 MSVC接受這個,因爲它是非標準擴展。看看rvalue to lvalue conversion Visual Studio

+2

我不知道我會把它稱爲一個錯誤,因爲MSVC發出警告,這是官方未定義的。 –

+0

@MooingDuck糾正。 – ForEveR

+1

至於爲什麼第一個表達式是有效的,C++允許在臨時對象上調用非常量成員函數。 –