二进制表达式中的 GCC 常量临时

GCC constant temporary in binary expression

本文关键字:常量 GCC 表达式 二进制      更新时间:2023-10-16

请考虑以下代码:

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 强制此临时在运算符上下文中保持不变,而不在方法调用上下文中,这是正确的行为吗?

A();

创建临时。

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

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