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]
.
没有影响
有这个代码:
#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]
.