C++11-右值引用
目的
实现移动语义(Move Sementics),减少不必要的临时对象的创建、拷贝、销毁(内存管理费时),极大地提升语言效率
完美转发(Perfect Forwarding),可以简洁地定义泛型函数
要点
右值引用除了拥有左值引用的功能,还可以绑定到临时对象(rvalue),而(non const)左值引用不可以!
1
2A& a_ref3 = A(); // Error!
A&& a_ref4 = A(); // Ok右值引用类型既可以被当作左值也可以被当作右值,判断的标准是,如果它有名字,那就是左值,否则就是右值。
为了确保move之后,不会被再次引用到。所以,有名字的变量是左值。
std::move
可以将一个有名变量(左值)转换为右值引用该功能的意图是,该变量作为其他变量的值来源后,便不再使用该值,只用来被赋值或弃用。
典型用途:
1
2
3
4
5
6
7template<class T>
void swap(T& a, T& b)
{
T tmp(std::move(a)); // a用来作为tmp的值来源
a = std::move(b); // a被重新赋值
b = std::move(tmp); // tmp不再使用
}注:若该类型不支持移动操作,则仍执行对应的拷贝或赋值操作。