C++ 11 右值引用

1. 左值 和 右值

举例:

int& func01() {
	int a = 3;
	return a;  // 不能返回局部变量的引用
}

void test09() {
	int a = 10;    // a 左值,10 右值
	int& b = a;    // 正确
	// int& c = 10;   // 错误

	const int& d = a; // 正确
	const int& e = 1; // 正确
    /*
    相当于:
    int tmp = 1;
    const int& c = tmp;
    */
}

总结:

        (a)左值可以取地址,右值不能取地址;

        (b)右值:字面量、函数返回的非引用变量。


2. 右值引用

如下:

/*
右值引用只能绑定右值,左值引用只能绑定左值。
*/
int&& a = 10; // 正确,可将右值赋值给右值引用
int b = 20;
int&& c = b;  // 错误,不可将左值赋值给右值引用

int&& d = a;  // 错误,右值引用变量本身是左值
int& e = a;   // 正确,可将右值引用变量赋给左值

3. 移动构造

简单来说就是资源转移,并未重新开辟内存空间。和右值引用密切相关。

个人认为和浅拷贝对比来说更易理解:浅拷贝是多个指针管理同一个资源,而移动构造则是在资源由原指针转移给新指针,而原指针置为nullptr,不再管理资源。


4. move移动语意和forward完美转发

move:得到右值类型,将资源管理权限转移。

forward:能够识别左值、右值,进而正确匹配到拷贝构造或移动构造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的马师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值