介绍一下左值右值,左值引用和右值引用

        先说左值和右值,简单来说可以放到等号左边的值叫做左值,可以放到等号右边的值叫做右值。

        详细的说,左值是有明确的地址,是具有名字的,是可以对左值进行取地址操作的,因为它在内存中有明确的地址和名字,可以赋值也可以被赋值,比如说变量,数组等都是左值。

        右值在内存中没有明确的地址,没有名字,不能长期在内存中驻留,不能对右值进行取地址的操作。

        右值在c++11中又分为纯右值和将亡值,常量和临时变量都是纯右值,纯右值就是传统意义上的右值,纯右值在它的表达式结束后就会被销毁。将亡值是右值,将亡值是表示即将被销毁,可以安全地被“窃取”(也就是移动操作)资源的对象。

       那什么是右值引用?

        为了实现将亡值,C++引入了一种特殊的引用类型,即右值引用,也就是说右值引用是为了实现将亡值得,右值引用的标识符是&&。只有将亡值能够绑定到右值引用上。

        但将亡值和纯右值不同,因为将亡值有识别符,可以通过识别符找到他们。使用std::move()函数可以将左值转为将亡值,这样就可以用右值引用来获取其资源,延长其生命周期。

int&& rvr = 1;   // 将亡值,它有一个识别符"rvr",我们可以通过rvr找到它。

int foo(){ return 1; }
int val1 = foo(); // 调用foo()返回临时值,此为纯右值,它没有识别符,我们不能通过识别符找到它。

使用move来将左值转换成右值后调用移动构造函数,来将其内存转移

#include <iostream>
#include <utility> // for std::move

void print(int&& num)
{
  std::cout << num << std::endl;
}

int main()
{
    int a = 5;  // a是一个左值
    print(std::move(a));  // 使用std::move将a转换为右值
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值