1.左值持久 右值短暂
左值有持久的状态,是定义的一个变量 右值要么是字面常量 要么是临时变量
左值表示的是一个对象的身份 比如变量名字 右值表示的是一个对象的值 比如字符串字面量
一般左值引用只可以绑定左值 常量左值引用可以绑定字面值或者临时对象
例如: const int& a=34; const A& a=A();
右值引用只能绑定到临时对象 所引用的对象即将被销毁 该对象没有其他用户
使用右值引用的对象可以接管所引用对象的资源 因为被引用的对象是右值,没有其他用户,即将被销毁,所以可以放心接管
int b=1; int &a=b;//正确左值引用 int&& a=b;//错误 右值引用必须引用一个临时对象或常量 如int&& a=1;
用右值初始化对象时候会调用移动构造函数 例如 A &&a=std::move(b); std::move()把一个左值b变成一个右值 随后将b中管理的资源置空 将其资源控制权转移给a
用右值给给一个对象赋值的时候会调用移动赋值运算符 例如 a=std::move(b);
例如:
class A {
public:
A() {
cout << "默认构造函数" << endl;
}
A(A&& a) {
cout << "移动构造函数" << endl;
}
A(const A& a) {
cout << "拷贝构造函数" << endl;
}
A& operator=(A&& a) {
cout << "移动赋值运算符" << endl;
return *this;
}
};
A a,c; //默认构造函数
A b = std::move(a); //移动构造函数 在b用右值初始化时候调用
b = std::move(c); //移动赋值运算符 在b用右值赋值时候调用
const A aa;
A d=aa; //调用拷贝构造函数 常量aa也是一个左值
原文:https://www.cnblogs.com/maomaolfq/p/13944179.html