std::move的定义如下:

1 template <typename T>
2 typename remove_reference<T>::type && move(T&& t)
3 {
4     return static_cast<typename remove_reference<T>::type&&>(t);
5 }

通过引用折叠,此参数可以与任何类型的实参匹配,既可以传递给move一个左值引用也可以传右值引用,如:
string s1("hi"), s2;
s2 = std::move(string("bye1!"));//正确,从一个右值移动数据
s2 = std::move(s1);//正确,但赋值之后,s1的值是不确定的。
1)针对std::move(string("bye1!")); 传入的已经是右值引用

  1. 函数模板推断出T的类型为string
  2. 因此,remove_reference用string进行实例化
  3. remove_reference<string>的 type成员是string
  4. move的返回类型是string&&move的函数参数t的类型是string&&

因此等价于:

string&& move(string&& t);

函数体返回static_cast<string&&>(t),由于t的类型已经是右值引用,因此无需进行任何转化。

2)针对std::move(s1); 传入的就是一个左值

  1. 函数模板推断出T的类型是string&(因为string& &&才能折叠为string&)
  2. 因此,remove_reference用string&进行实例化
  3. remove_reference<string>的 type成员是string
  4. move的返回类型是string&&
  5. move的函数参数t的类型是string& &&,会折叠为string&

因此等价于:

string&& move(string& t);

函数体返回static_cast<string&&>(t),这里t的类型是string&,通过static_cast将其转化为string&&

std::move的实际工作过程相关推荐

  1. C++核心准则ES.56​:只在需要将一个对象显式移动到另外的作用域时使用std::move​

    ES.56: Write std::move() only when you need to explicitly move an object to another scope ES.56:只在需要 ...

  2. C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...

  3. std::move C++11 标准新特性: 右值引用与转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  4. C++11 std::shared_ptr的std::move()移动语义底层分析

    std::shared_ptr的std::move()移动语义底层分析 执行std::move()之前: 执行std::move()之后: 结论:一个浅拷贝 sizeof(std::shared_pt ...

  5. std::move()源码分析

    https://segmentfault.com/a/1190000020744971?utm_source=tag-newest C++11 引入右值和移动语义,其中std::move()是不可或缺 ...

  6. 什么是std :: move(),什么时候应该使用?

    它是什么? 它有什么作用? 什么时候应该使用? 赞赏良好的链接. #1楼 当您需要在其他地方"传输"对象的内容时,可以使用move,而无需复制(即内容不重复,这就是为什么它可以用于 ...

  7. C++ std::move/std::forward/完美转发

    右值引用相关的几个函数:std::move, std::forward 和 成员的 emplace_back; 通过这些函数我们可以避免不必要的拷贝,提高程序性能. move 是将 对象的状态 或者 ...

  8. push_back、emplace_back、std::move

    1.push_back和emplace_back的区别 emplace_back() 和 push_back() 的区别: 就在于底层实现的机制不同.push_back() 向容器尾部添加元素时,首先 ...

  9. std::move的理解和使用

    最初接触到std::move,以为std::move具有类似于swap的功能,可以避免内存的拷贝.后来查看资料发现,std::move的实现并没有交换内存的操作. 那么std::move是如何避免内存 ...

最新文章

  1. QIIME 2教程. 27语义类型Semantic(2021.2)
  2. 【问题收集·中级】关于XMPP使用Base传送图片
  3. WPF Calendar 日历控件 样式自定义
  4. ST表(模板)「 查询区间最值 」
  5. 几行代码,网盘链接提头来见!
  6. 为什么C4C UI上看不到新建按钮
  7. LaTeX中巨算符下面输入两行内容的方法
  8. [Bzoj1911][Apio2010]特别行动队(斜率优化)
  9. Facebook股价周四大涨15.5% 市值超亚马逊
  10. 关于在GridControl中添加GridLookUpEdit绑定数据
  11. 简易可行Live2D直播应用路线分享
  12. 【Java SE】static成员及代码块
  13. Adobe FLASH CS6 安装错误解决方法
  14. java 换行分割_java – 如何通过换行分割字符串?
  15. 节奏旋律音乐制作软件-Native Instruments Maschine 2 v2.14.1 WiN
  16. 使用mono构建c#脚本运行环境
  17. 纯前端提示页面版本更新
  18. 广东省人力资源和社会保险个人资料下载
  19. 尼古拉·特斯拉,到底有多神?
  20. HTML微博浮动代码,jQuery实现仿新浪微博浮动的消息提示框(可智能定位)

热门文章

  1. 龙腾15寸液晶屏M150GNN2 R1规格资料
  2. flutter 动画json_Flutter 中的 JSON 解析
  3. 禁止本地服务dubbo、nacos服务法宣向注册中心注册
  4. 达芬奇无声音解决方案
  5. Python爬虫笔记——xpath的contains用法
  6. 乐视电视故意无法投屏,解决方法来了
  7. vscode配置setting和eslintrc.js
  8. Kali 2.0 安装与基础配置
  9. 网络基础之网络层详解
  10. SV学习笔记—包package的使用