1.move semantics
移动语义,完美转发,std::move,std::forward
https://www.cnblogs.com/qicosmos/p/4283455.html
什么左值和右值
可以这样理解:
左值
表达式结束后依然存在的持久化对象
右值
表达式结束时就不再存在的临时对象。
左值引用于右值引用
int& l_ref=a; // 左值引用
int&& r_ref=std::move(l_ref); // 右值引用注意
被声明出来的左值引用和右值引用,都是左值
std::move() 的作用
std::move(arg) 实际是把arg转换成右值。
使用std::move()实现资源转移,保持资源只有一个所属者,转移之后,老的资源所属者的行为未定义。
例如
输出如下,类似拷贝,此时a等于b,但是b的行为已经未定义了。
作用与适用场景
很明显,提高效率,减少拷贝
但是也不能滥用,一般使用情况是:老变量是暂时变量或者不用的变量
移动语义
容器元素新增
临时数组拷贝
自定义右值拷贝函数,实现移动语义
unique_ptr
有些STL类是move-only的,比如unique_ptr,只有移动构造函数,因此只能移动(转移内部对象所有权,或者叫浅拷贝),不能拷贝(深拷贝)
完美转发
std::forward()
与move功能类似,不过move只能转出来右值,forward都可以。
std::forward<T>(u)有两个参数:T与 u。
a. 当T为左值引用类型时,u将被转换为T类型的左值;
b. 否则u将被转换为T类型右值。
上边的示例在日常编程中基本不会用到,std::forward最主要运于模版编程的参数转发中。
最后更新于
这有帮助吗?