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. python自动排课表_【python-leetcode210-拓扑排序】课程表Ⅱ
  2. 再有人问你MySQL是如何查询数据的,请把这篇文章甩给他!
  3. python ipaddr_python之IP地址或IP段处理模块-ipaddr
  4. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc
  5. Angular Route数据结构里常用字段使用方法一览
  6. 【读书笔记】.Net并行编程高级教程--Parallel
  7. C++_类和对象_C++继承_基本语法---C++语言工作笔记061
  8. 正则表达式匹配NOD用户名与密码
  9. 安装Linux Mint遇到的坑和解决方法|花屏|无法进入安装引导界面|驱动异常|无法连接WiFi......
  10. 一次排查服务器挖矿病毒
  11. 【wangeditor富文本编辑器v4版自定义功能】格式刷
  12. 数据分析新人如何面对繁杂且突然的数据需求
  13. 关于营销自动化,30个惊人的事实
  14. youtube批量采集-低成本解决方案-2
  15. 应该来说没有什么太大的关系。因为计算精度既取决于你的级数的项
  16. 永不放弃--一个藏羚人的感人故事
  17. 上半年要写的博客文章27
  18. hbase数据库_hbase数据库 修改数据
  19. 博弈论-多智能体强化学习基础
  20. JAVA开发运维(CI/CD)

热门文章

  1. Python+Selenium动态网页的信息爬取
  2. Genymotion中文输入解决方案
  3. 开始在NEC中国研究院做事,心情愉快
  4. 【HTML】HTML作业-----影院售票界面
  5. 水利数字孪生工程 推动智慧水利信息化建设和调度
  6. [BJDCTF2020]认真你就输了——学习记录
  7. navicat连接 mysql 报错1251如何解决
  8. AEJoy —— 表达式之 3D 角点大头针【JS】
  9. 计算机实用基础试题答案,广西成人高校《计算机实用基础》统考理论试题(A卷)(含答案)...
  10. 湖北计算机初级考试时间,湖北省2021年初级会计考试时间安排在这里!