移动
右值
右值指临时值,如 i * 10 或 函数返回值 等 即将消亡的值 ,在传递这些值时,一般会对内容进行拷贝,然后右值再销毁。但如果直接把本该销毁的空间直接占为己有,便会提高效率
右值引用
形如 int&& i;
std::move()
move可以将右值进行移动赋值如 i = move(a * 10);
移动构造
//移动构造,第一个参数为该类型右值引用
A(A&&);
移动赋值运算符
A& operator=(A&&);
注意事项
- 如果一个类型显式构造了拷贝构造函数,那么编译器将不会合成移动构造函数。相反如果类没有定义任何拷贝控制操作,且数据均可进行移动,那么编译器会合成移动操作。
- 类有成员为引用,const,则移动操作被定义为删除
- 成员指针复制时,记得将原对象指针置空,防止释放而产生野指针,如下代码中的 char* c
#include<iostream>
using namespace std;
struct A {
int num;
char* c;
A(){}
A(A&& a)
{
this->num = a.num;
this->c = a.c;
a.c = nullptr;
}
~A()
{
delete c;
}
};
A GetA()
{
A a;
a.c = new char;
*a.c = 'c';
return a;
}
int main()
{
A m_a = GetA();
cout << *m_a.c << endl;
}