请考虑以下代码:
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
}
VC接受表达式1和2。表达式2被GCC拒绝,“没有可行的过载'+ ='”。但是,对于引用常量对象的运算符,接受这样的表达式:
const A& operator+=( const A& a, int i ) { return a; }
为什么GCC强制这个临时在不在方法调用上下文中的运算符上下文中是常量,并且这是正确的行为吗?
答案 0 :(得分:3)
A();
创建临时。
A& operator+=( A& a, int i ) { return a; }
临时无法绑定到reference
。 MSVC接受此,因为它是非标准扩展。看rvalue to lvalue conversion Visual Studio