C++ Primer : 第十三章 : 拷贝控制之对象移动

本文探讨了C++中的移动构造函数和移动赋值运算符,解释了何时编译器会删除这些特殊函数,以及如何与右值引用配合使用。内容包括右值引用的重要性,移动构造函数和移动赋值运算符的定义条件,以及它们与类成员函数的关系。
摘要由CSDN通过智能技术生成

右值引用

所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象。右值引用也是引用,因此右值引用也只不过是对象的别名而已。 右值引用可以绑定到要求转换的表达式、字面常量或者返回右值的表达式,但是右值不能绑定到一个左值上


int i = 42;
int &r = i; // 正确,r引用i
int&& rr = i; // 错误,不能将右值引用绑定到左值
int &r2 = i * 42; // 错误,i*42是一个右值
const int& r3 = i * 42;
int&& rr2 = i * 42;


返回左值的函数、连同赋值、下标、解引用和前置递增或递减运算符都是返回左值的例子。
返回非引用类型的函数、连同算数、关系、位以及后置递增或递减运算符,都是生成右值的例子。

我们可以将一个const的左值引用或一个右值引用绑定到生成右值的例子上


我们不能把右值直接绑定到一个变量上,即使这个变量时右值引用类型也不行

int&& rr1 = 42;
int&& rr2 = rr1; // 错误,表达式rr1是左值



标准库move函数
我们可以通过标准库函数move来获得绑定到左值上的右值引用。

int&& rr3 = std::move(rr1);

move旨在告诉编译器,我们希望把一个左值像右值一样使用它。使用move函数就意味着:除了对rr1赋值或销毁之外,我们不能再使用它。 使用move之后,我们就不能对源对象的值做任何假设



移动构造函数和移动赋值运算符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值