C++笔记-C++11(二)
紧接上文,我们在介绍了移动构造和移动赋值时仅仅只介绍了函数返回值的情况,那么什么场景还会用到呢?我们接着往下看:
3.5.4右值引用和移动语义在传参中的提效
通过查看STL文档中的一些容器如vector,list,我们可以看出在他们中push和insert系列接口在C++11中引入了右值引用的版本。
这些信息就体现在我们现在要讲的在传参上的体现,同时也告诉我们当参数是一个左值时,容器内部继续调用拷贝构造进行拷贝,将对象拷贝到容器空间中的对象;当对象是一个右值时,容器内部则调用移动构造,右值对象的资源到容器空间的对象上。
我们看这几个例子,在传参时也同样调用了相应的拷贝构造和移动构造。
上面我们是利用了stl库中的list来控制我们自己写的string类,下面我们来尝试写出list中的push_back和insert中对右值引用的相关操作:
下面以我们之前在list的章节自己实现list的为例,这里就不展示全部的代码了。
这是我们对之前写的list所进行的修改,这里注意我们在参数部分虽然用了右值引用,但是上节我们讲了变量表达式均为左值,所以我们在复用传参时还要注意将变量表达式通过move函数强转为右值,不然还是会调用左值的拷贝构造函数,并且少一个都不行。
这是没有问题的list,和我们调用库中的一样,但是:
这里我就把ListNode中的构造函数少写了move函数来将参数强转为右值,通过上图可以看出结果发生了改变,只调用了左值的拷贝构造函数,所以我们在自己联系时一定要注意这点。
3.6类型分类
1.C++11以后,进⼀步对类型进⾏了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值
(expiring value,简称xvalue)。
2. 纯右值是指那些字⾯值常量或求值结果相当于字⾯值或是⼀个不具名的临时对象。如: 42 、
true 、 nullptr 或者类似 str.substr(1, 2) 、 str1 + str2 传值返回函数调⽤,或者整形 a 、 b , a++ , a+b 等。纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于C++98中的右值。
3. 将亡值是指返回右值引⽤的函数的调⽤表达式和转换为右值引⽤的转换函数的调⽤表达,如move(x) 、 static_cast<X&&>(x)。4.泛左值(generalized value,简称glvalue),泛左值包含将亡值和左值。
