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& ...
随机推荐
- Linux 目录挂载服务
Linux 服务器挂载文件目录通常有三种形式,手动挂载.自动挂载.Autofs 自动挂载,下面对这三个挂载做一下介绍,接受一下这三个区别以及使用场景: 准备服务器和客户端: server 192.16 ...
- 时空图神经网路:STGNNs
STGNNs:SPATIAL–TEMPORAL GRAPH NEURAL NETWORKS 许多实际应用中的图在图结构和图输入方面都是动态的.STGNNs在捕获图的动态性方面占有重要地位. 这类方法的 ...
- 腾讯云原生数据库TDSQL-C架构探索和实践
作为云原生技术先驱,腾讯云数据库内核团队致力于不断提升产品的可用性.可靠性.性能和可扩展性,为用户提供更加极致的体验.为帮助用户了解极致体验背后的关键技术点,本期带来腾讯云数据库专家工程师王鲁俊给大家 ...
- C++实现ETW进行进程变动监控
C++实现ETW进行进程变动监控 文章地址:https://www.cnblogs.com/Icys/p/EtwProcess.html 何为Etw ETW(Event Tracing for Win ...
- 线程池ThreadPoolExector核心ctl, execute, addWorker, reject源码分析
线程池核心方法execute()解析: public void execute(Runnable command) {//#1 if (command == null) throw new NullP ...
- windows配置skywalking集群
一.zookeeper 准备配置三个zookeeper,因为我是单台模拟,所以需要使用不同的端口,使用版本是apache-zookeeper-3.6.3-bin (必须是3.5+) 1.第1个zook ...
- nginx服务器配置传递给下一层的信息的一些参数-设置哪些跨域的域名可访问
http { server_tokens off; #隐藏nginx版本 proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_si ...
- 牛客SQL刷题第三趴——SQL大厂面试真题
01 某音短视频 SQL156 各个视频的平均完播率 [描述]用户-视频互动表tb_user_video_log.(uid-用户ID, video_id-视频ID, start_time-开始观看时间 ...
- 【有用的SQL】查Greenplum的数据字典
Greenplum 查询哪个表的分布键 ( Greenplum ) SELECT att.nspname AS 模式名 , att.relname AS 表名 , table_comment AS 表 ...
- javascript打印对象函数
//js对象打印函数 function writeObj(obj) { var description = ""; for (var i in obj) { var propert ...