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,只有移动构造函数,因此只能移动(转移内部对象所有权,或者叫浅拷贝),不能拷贝(深拷贝)

完美转发

参考:https://zhuanlan.zhihu.com/p/335994370

std::forward()

与move功能类似,不过move只能转出来右值,forward都可以。

std::forward<T>(u)有两个参数:T与 u。

a. 当T为左值引用类型时,u将被转换为T类型的左值;

b. 否则u将被转换为T类型右值。

上边的示例在日常编程中基本不会用到,std::forward最主要运于模版编程的参数转发中。

最后更新于

这有帮助吗?