returns 值的复制构造函数如何丢弃临时文件?

How does copy constructor that returns value, discards the temp?

有这个代码:

#include <iostream>

class Base {
public:
    Base() = default;

    explicit Base(int val) : _var(val) {}

    Base operator=(const Base &rhs) {
        _var = rhs._var;
        return *this;
    }

    void print() const {
        std::cout << _var << std::endl;
    }

private:
    int _var;
};

int main() {
    Base b[] = {Base(10), Base(), Base(), Base()};
    (b[1] = b[2]) = b[0];
    for (Base base: b) {
        base.print();
    }
}

输出是:

10
0
0
0

但我希望

10
10
0
0

因为数组 b[1] 中的第二个元素应该从 b[0] 中赋值,但是赋值运算符 returns 的值不是引用,因此发生了复制构造。但是,为什么 b[1] 没有被复制为 _var=10

如果 operator= 返回 Base &,输出将是我的期望

要获得 赋值运算符 的预期结果(顺便说一下,它不同于 复制构造函数 ),您需要给 return 个参考:

Base& operator=(const Base &rhs)

这是规范形式。

在没有引用的情况下,(b[1] = b[2]) 的结果存储在一个临时文件中。 (b[1] = b[2]) = b[0]; 分配给那个临时的,它被丢弃并且对 b[1].

没有影响