浅谈std::move和std::forward原理

前言

本文主要整理了C++11中std::move和std::forward的原理, 这对理解C++的移动拷贝有很重的意义。

一、左值和右值

左值: 一般来说,能在内存中取得其地址, 即是左值。

右值:在内存在无取得其地址的, 即是右值。

note: 左值持久,右值暂短。 左值有持久的状态,一般是变量, 而右值要么是字面常量, 要么是在表达式求值过程中创建的临时对象。

二、左值引用和右值引用

右值引用:绑定到右值的引用。 (为了支持移动操作引入)

左值引用: 为了区分右值引用, 我们把常规的引用称为左值引用。

右值引用引入的意义:

Rvalue references is a small technical extension to the C++ language. Rvalue references allow programmers to avoid logically unnecessary copying and to provide perfect forwarding functions. They are primarily meant to aid in the design of higher performance and more robust libraries.

简单说,引入右值引用就是为了避免不必要的拷贝和支持完美转发。

三、std::move

简单了解了左值, 右值, 左值引用, 右值引用。

接下来描述std::move和std::forward的功能以及原理分析。

函数功能

std::move: 功能将一个左值/右值, 转换为右值引用。 主要是将左值强制转为右值引用,因为右值引用无法直接绑定到左值上, 为了能让右值引用绑定到左值上, 必须将左值转为右值引用,std::move提供做的就是这个。 对于传入右值, 那么std::move将什么都不做, 直接返回对应的右值引用。

std::forward: 功能将参数类型原封不打转发到一下个函数, 包括const属性。 这就是所谓的**“完美转发(perfect forwarding)”**

在深入分析std::move和std::forward之前, 先了解一个概念**“引用折叠”/ “引用坍塌”(reference-collapsing rules)**, 如果我们间接创建了一个引用的引用, 这些引用将会形成"折叠", 规则如下。

  • X& & , X& && 和X&& &都会折叠成类型X&
  • 类型X&& &&折叠成X&&

由此可见, 只有一种情况折叠成右值引用, 即右值引用的右值引用。 其他都折叠为左值引用。

std::move实现原理分析

std::move实现如下

  /**
   *  @brief  Convert a value to an rvalue.
   *  @param  __t  A thing of arbitrary type.
   *  @return The parameter cast to an rvalue-reference to allow moving it.
  */
  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    {
    return static_cast<typename std::remove_reference<_Tp>
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值