为什么rvalue reference是lvalue

gcc-4.9.2\libstdc++-v3\include\bits\stl_vector.h的代码:

      /**
       *  @brief  %Vector move constructor.
       *  @param  __x  A %vector of identical element and allocator types.
       *
       *  The newly-created %vector contains the exact contents of @a __x.
       *  The contents of @a __x are a valid, but unspecified %vector.
       */
      vector(vector&& __x) noexcept
      : _Base(std::move(__x)) { }

问题来了,x是个rvalue reference啊,为什么要std::move(x),_Base(x)不能直接调用_Base(&&)么?

这个很多文章,视频,书都会讲到的,x是个rvalue reference,但它是个lvalue,所以必须std::move(x)

听上去总是很蛋疼,还是没讲明白为什么啊。

讲明白的如下:

lvalue和rvalue在标准的[basic.lval]:

Expressions are categorized according to the taxonomy in Figure 1

然后Figure 1华丽丽的给出了expression的lvalue,rvalue,glvalue,xvalue,prvalue。。。但是很明确的一点是,这个分类是针对expression的一套分类系统,和类型没有关系。而lvalue reference,rvalue reference显然是两个reference类型,从属于类型系统。

回到上面的代码,__x的类型毫无疑问是rvalue reference,然后__x这个expression是显然归属于lvalue的,所以才有了std::move(__x)的使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值