C++11的一个最重要特性就是支持移动语义,其中一个比较关键的函数就是std::move 那这个函数的作用是什么?

首先打开库文件 找到move的定义:

注意:不要把&&理解成引用的引用,这就是一个关键字

大概函数如下:

template<class T>
remove_reference_t<T>&& move(T && a) noexcept
{return static_cast<remove_reference_t<T>&&>(arg);
}

说白了这个函数的作用就是把传进来的参数强制转换成右值引用

可能有些人会有疑问,

为什么参数已经是右值引用了?

这就要说到参数推导了
比如以下例子:

template<typename T>
void foo(T&& params);

如果传进来的是一个左值

int a = 10;
foo(a);

此时params被推导为int&

如果传进来的是一个右值

foo(20);

此时paramas被推导为int&&

remove_reference的作用是什么?

就是去掉引用,比如int& 变成int int&&变成 int

也就是说std::move把你传进来的参数所有的引用都去掉,然后在加上&&,也就是变成右值引用

remove_reference是怎么实现的?

非常简单,首先看看定义:

可以看到有了三个模板匹配,不管你传的是什么,我都能去掉你的引用,通过::type得到你原始的类型

其中remove_referenct_t 无非是一个方便的写法

typename是为了说明 remove_reference是一个class

C++move函数详解相关推荐

  1. python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...

    Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...

  2. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  3. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  4. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  5. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  6. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  7. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  8. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  9. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

最新文章

  1. Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版
  2. 汇编调用c语言函数 call printf,如何在汇编调用c语言函数?
  3. Knockout js 绑定 radio 时,当绑定整形的时候,绑定不生效
  4. 区块链BaaS云服务(17)纸贵科技Z-BaaS“数据治理”
  5. 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
  6. php匿名类的应用场景,【modernPHP专题(9)】匿名类
  7. tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项
  8. 【BOI2007】【BZOJ1176】Mokia
  9. jdk1.8 新特性(中英文)及中文版帮助文档
  10. mac 安装redis 视频教程
  11. 全国所有火车站(12306官方客运营业站站点)很全!!
  12. 关于离开,请诸位保重自己
  13. SVPWM的一些理解
  14. 太原市社会保险新数据中心建设及系统搬迁项目
  15. 牛客网前端刷题(三)
  16. JAVA程序设计:灯泡开关(LeetCode:319)
  17. Masonry的使用,动画,出现问题解决等
  18. 应用三菱GX Developer编程软件编写SFC顺序功能图的方法
  19. cmd命令下,使用java命令,运行指定目录下的*.class文件。
  20. 防守地图隐藏英雄密码全集

热门文章

  1. 市场调研中如何做数据分析?
  2. 榜单首发:车载扬声器市场份额TOP10供应商「竞逐」座舱新周期
  3. pytorch实现DCGAN生成动漫人物头像
  4. ie6,ie7,ie8,ie9 css bug兼容解决记录
  5. 摒弃法解决数独问题sudoku,附python实现
  6. 广联达bim5d手机端_广联达BIM5D手机端操作说明-生产首页
  7. eCPRI payload 解析
  8. Netflix是什么,与Spring Cloud有什么关系
  9. MySQL下载安装使用-完整详细步骤
  10. 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法