关于std::move与右值引用
先来看一个例子
class A {
public:
A(){
arr_ = new int[10]();
len_ = 10;
}
A(A && a) {
arr_ = a.arr_;
a.arr_ = nullptr;
len_ = a.len_;
}
int *arr_;
int len_
}
void fun1(A && a1) { //引用不产生新对象
fun2(std::move(a1));
}
void fun2(A && a2) { //引用不产生新对象
A a3 = std::move(a2); //调用A::A(A&& a)构造函数
}
int main() {
A a;
fun1(std::move(a));
}
在整个程序中 一共构造了几个A对象?
我的答案是:2个
如果这样实现 一个构造了几个A对象?
void fun1(A a1) {
fun2(std::move(a1)); // 移动构造 产生一个新对象 此处语句等价于 A a1 = std::move(a)
}
void fun2(A a2) {
A a3 = std::move(a2); //调用A::A(A&& a)构造函数
}
int main() {
A a;
fun1(std::move(a));
}
是4个
记住两句话:
1、std::move 只是将一个左值变成右值,从而让右值引用能引用到变量
2、右值引用也是引用
当然对于第二点有一个事实:
void fun(A && a) {
a.len = 9;
}
int main() {
A a; // 初始化len是10
fun(std::move(a));
cout << a.len; // 9
}