std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:

通过std::move,可以避免不必要的拷贝操作。

std::move是为性能而生。

std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

说明:

  1. std::move(t) 用来表明对象t 是可以moved from的,它允许高效的从t资源转换到lvalue上.
  2. 注意,标准库对象支持moved from的左值在moved 之后它的对象原值是有效的(可以正常析构),但是是unspecified的,可以理解为空数据,但是这个对象的其他方法返回值不一定是0,比如size().所以,moved from 之后的对象最好还是不要使用吧?(如有不正确理解,请告知)
  3. 对本身进行move,并赋值给本身是undefined的行为.

如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。

#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{std::string str = "Hello";std::vector<std::string> v;//调用常规的拷贝构造函数,新建字符数组,拷贝数据v.push_back(str);std::cout << "After copy, str is \"" << str << "\"\n";//调用移动构造函数,掏空str,掏空后,最好不要使用strv.push_back(std::move(str));std::cout << "After move, str is \"" << str << "\"\n";std::cout << "The contents of the vector are \"" << v[0]<< "\", \"" << v[1] << "\"\n";
}

输出结果:

After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"

更详细请看

https://blog.csdn.net/swartz_lubel/article/details/59620868

std:move基本用法相关推荐

  1. std:move基本用法和理解

    场景: C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了. ...

  2. std::move原理实现与用法总结

    文章目录 一.左值与右值 二.左值引用和右值引用 1.std::move简介 2.std::move详解 3.std::move的优点   右值引用(及其支持的Move语意和完美转发)是C++0x加入 ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move

    1. 标准库定义 / / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 ) reference 是在 16.2.3 节( 第 605 页 ) 中介绍的 ...

  4. [C/C++]关于C++11中的std::move和std::forward

    http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.html std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从 ...

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

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

  6. C/C++编程:std::move(将左值强制转换为右值)

    正文 C++11标准中借助右值引用可以为指定类添加移动构造函数,这样当使用给类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数 注意,移动构造函数的调用时机是:用同类的右 ...

  7. 【c++】std::move 所有权转移的使用

    1. std::move用法详细梳理 ref_frames_ = std::move(ref_frames);cur_frames_ = cur_frames; 使用std::move函数的好处是可以 ...

  8. 左值/右值/左值引用/右值引用/move的用法介绍

    目录 问题 左值和右值 概念总结: 需要用到左值的运算符: 引用分类 左值引用 右值引用 右值引用到底什么用? std::move()函数介绍 问题 什么是左值和右值? 什么是左/右值引用? 左/右值 ...

  9. C++右值引用 和 std::move()

    void debug(int&& a){return a; } std::move(a) 可以将左值变为右值 int c = 0x100; // c 可以被取地址,c 为左值,c++ ...

最新文章

  1. 2017年10月08日普及组 蜡烛
  2. Apache Ranger插件的美丽简洁
  3. STM32H743+CubeMX-两路FDCAN同时工作的终极方案(RTX5)
  4. Tomcat 5 5-Manager App HOW-TO 翻译了部份 努力中
  5. JQuery Dialog(JS模态窗口,可拖拽的DIV)
  6. linux 常用指令汇总
  7. c语言正则表达式库,c语言正则表达式库--PCRE
  8. explain分析sql效果
  9. 13个坏习惯让IT工作者中过劳(转)
  10. table或者列表中超出的字用省略号代替的方法(支持IE6)
  11. CF984C Finite or not?
  12. 【Unity3d】脚本的生命周期及其相关函数
  13. leetcode547 朋友圈
  14. 万物皆可秒——淘宝秒杀Python脚本,扫货618,备战双11!
  15. GTX1060 Windows10 旧版显卡驱动下载链接
  16. 玩转EXCEL系列-选择性粘贴几个实用技巧
  17. 软件工程个人项目— 数独
  18. 社交网络关系 mysql架构_社交网络海量用户关系(关系链)设计思考
  19. Django 博客开发教程 8 - 博客文章详情页
  20. 3D打印技术新进展,正带来哪些产业新机会?

热门文章

  1. 【数据结构】八大排序
  2. 基于JAVA国外摇滚乐队交流和周边售卖系统计算机毕业设计源码+数据库+lw文档+系统+部署
  3. invokeAny和invokeAll的使用思路
  4. office显示登陆错误,出现0X80190001错误。
  5. time_t tm timeval 的区别
  6. 视频文件大小计算方法(终极篇附实例)
  7. 提权学习:第三方软件提权(FileZilla 提权)14147
  8. 直播美颜技术:视频美颜sdk的快速集成与开发实践
  9. ThinkPHP6+JWT 中间件校验Token时效性
  10. 【计算机网络:自顶向下方法】(二)应用层