cpp-右值引用相关概念

参考

C++11引入了右值引用,用 && 表示右值引用,如 int &&a = add(1,2)
什么是左值和右值

int a = 10;

等号 “=” 左边的 a 为左值,右边的 10 为右值;具体地说就是较难获取到具体地址的值,大多数都是临时变量。地址是不确定的。

1. 硬编码的字面量,如int a =10中的10,char *s = "hello world"中的“hello world”都是右值
2. 函数的返回值,如add(1,2)的返回值3也是右值,这里的3是临时值
3. 表达式的计算值,如int a =1,b =2;int c = a+b;中的a+b的值也是右值,这里a+b的值也是临时值

移动构造函数:转移类成员的所有权

std::move:把一个左值引用“强制转换”为右值引用。

emplace_back

template< class... Args >
void emplace_back( Args&&... args );

从函数声明中,我们看到其参数是右值引用,右值引用可以用来干什么?移动元素的所有权!

vector<A> vec;
A a(10);
vec.emplace_back(std::move(a));
//输出结果为:
constructor
move constructor