std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题
unique_ptr 不能进行赋值操作,但是可以有返回unique_ptr的函数,由此产生的问题:
结论1:std:move() 只是将一个实参强行转换为右值引用。
我们知道对象初始化时有 构造函数,拷贝构造函数,移动构造函数;其中移动构造函数能够防止拷贝过程,减小性能开销;
1.拷贝构造函数通常使用赋值运算可以触发,如T a=b;
2.而移动构造函数需要使用右值引用来赋值,因此通常需要搭配std:move()使用
T a=std:move(b);或者T a = func(); 其中func() 一个返回T类型的函数;
举个例子:
1 #include <iostream>
2 #include <memory>
3 using namespace std;
4
5 class A {
6 public:
7 A() {
8 cout << "构造函数" << endl;
9 }
10 A(const A& a) {
11 cout << "拷贝构造" << endl;
12 }
13 A(A&& a) {
14 cout << "移动构造" << endl;
15 }
16 virtual ~A() {}
17 };
18
19 A func(A a){
20 cout<<"func body"<<endl;
21 return a;
22 }
23
24 int main() {
25 A a;
26 cout<<endl;
27 A b=a;
28 cout<<endl;
29 A c=move(a);
30 cout<<endl;
31 A d=func(a);
32 return 0;
33 }
运行结果:
构造函数 拷贝构造 移动构造 拷贝构造
func body
移动构造
结论2:那么在移动语义后右值将会如何呢,答案是调用析构函数销毁。
如 T a =std:move(b); 语句后 b将被销毁。
举个例子:
1 #include <iostream>
2 #include <memory>
3 using namespace std;
4 int main() {
5 unique_ptr<int> ptr1(new int(10));
6 unique_ptr<int> ptr2=move(ptr1);
7 if(ptr1==nullptr)
8 cout<<"ptr1==null "<<endl;
9 //cout<<*ptr1<<endl; //引发段错误,已析构
10 cout <<&ptr1 << endl << &ptr2 << endl;
11 return 0;
12 }
运行结果:
1 ptr1==null
2 0x7fffd55dc548
3 0x7fffd55dc550
std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题的更多相关文章
- std::move的原理与实现,右值引用的深入理解
这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...
- 对C++11中的`移动语义`与`右值引用`的介绍与讨论
本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap ...
- move语义和右值引用
C++11支持move语义,用以避免非必要拷贝和临时对象. 具体内容见收藏中的“C++右值引用” .
- item 23: 理解std::move和std::forward
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...
- C++右值引用浅析
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...
- C++ 新特性 笔记 2 右值引用
C ++ Rvalue引用说明 以下内容,主要是上述链接的摘要 介绍 Rvalue引用是C ++的一个特性,它是随C ++ 11标准添加的.使右值参考有点难以理解的是,当你第一次看到它们时,不清楚它们 ...
- 第16课 右值引用(3)_std::forward与完美转发
1. std::forward原型 template <typename T> T&& forward(typename std::remove_reference< ...
- (转)C++11使用emplace_back代替push_back (其中有关于右值引用)
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 首先,写 ...
- 第15课 右值引用(2)_std::move和移动语义
1. std::move (1)std::move的原型 template<typename T> typename remove_reference<T>::type& ...
随机推荐
- Java数组和Arrays 类
1.创建数组的三种方式: ①动态初始化:数组的初始化和数组元素的赋值操作分开进行 dataType[ ] arrayRefVar = new dataType [ arraySize ] ; Emp ...
- SSH远程连接学校实验室服务器 一 python版本问题
问题1: 连接上远程服务器后,输入 python 发现python版本只有2.7 .试图使用以下方式更新: sudo apt install python3.9 会出现如下报错信息: 解决方式: 一般 ...
- day09 集合排序_Collection接口与Collections工具类
集合的排序 java.util.Collections类 Collections是集合的工具类,里面定义了很多静态方法用于操作集合. Collections.sort(List list)方法 可以对 ...
- InputStreamReader介绍&代码实现和转换文件编码_练习
InputStreamReader介绍&代码实现 package com.yang.Test.ReverseStream; import java.io.FileInputStream; im ...
- 丽泽普及2022交流赛day14
目录 A 题面 题解 B 题面 题解 C 题面 题解 D 题面 题解 A 题面 一个 \(1\dots n\) 的排列 \(p\) 和一个 \(1\dots n-1\) 的排列 \(q\) 满足 对排 ...
- javascript 原生class操作
<script type="text/javascript"> function hasClass(elements, cName) { return elements ...
- netdata检测工具的安装与使用
Netdata 是一款 Linux 性能实时监测工具..以web的可视化方式展示系统及应用程序的实时运行状态(包括cpu.内存.硬盘输入/输出.网络等linux性能的数据). Netdata文档地址: ...
- Python3+Django2集成PayPal(贝宝)跨境支付三方接口以及订单查询和退款业务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_157 如果您所在的公司涉及外贸或者跨境支付业务,那一定听说过大名鼎鼎的PayPal,总的来说,PayPal在跨国贸易里的优势还是比 ...
- 利用本地HTTPS模拟环境为FastAPI框架集成FaceBook社交三方登录
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_174 提起社交,就不得不说马克·扎克伯格(Mark Zuckerberg)一手创办的社交网络(FaceBook).进入2020年, ...
- Win10 x64 安装Eplan P8 2.7 小结
一.软件安装准备及过程 为免版权纠纷,此处不提供下载链接,请自行查找资源. 1.打开"Electric P8 2.7.3.11418"目录,以管理员身份运行"setup. ...