GCC常量二进制表达式临时

时间:2012-09-24 20:57:29

标签: c++ 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
}

VC接受表达式1和2。表达式2被GCC拒绝,“没有可行的过载'+ ='”。但是,对于引用常量对象的运算符,接受这样的表达式:

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

为什么GCC强制这个临时在不在方法调用上下文中的运算符上下文中是常量,并且这是正确的行为吗?

1 个答案:

答案 0 :(得分:3)

A();

创建临时。

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

临时无法绑定到reference。 MSVC接受此,因为它是非标准扩展。看rvalue to lvalue conversion Visual Studio