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
}

VC 接受表达式 1 和 2。表达式 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; }

临时不能绑定到reference. MSVC 接受这一点,因为它是非标准扩展。查看右值到左值的转换 Visual Studio

于 2012-09-24T20:59:35.400 回答