【发布时间】:2021-12-31 14:38:49
【问题描述】:
有这个代码:
#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] 中赋值,但是赋值运算符返回的是值,而不是引用,因此会发生复制构造。但是,为什么不将b[1] 复制构造为具有_var=10?
如果operator= 返回Base &,输出将是我的预期
【问题讨论】:
-
用括号指定
b[1] = b[2]无论如何都会首先发生。b[2]中的var是什么?现在是 0 -
@AlexeyLarionov 然后
b[1]应该得到b[0]的分配变量,即10 -
不,
b[1] = b[2]在此处返回b[1]的副本,请检查赋值运算符的返回类型(它不是引用类型)。所以b[0]被分配给b[1]的副本,然后被丢弃。 -
为什么会这样?
b[1] = b[2]按值返回,因此它是分配给b[0]的b[1]的临时副本。由于您不保存此副本,因此它只是被丢弃
标签: c++ copy-constructor rvalue