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的"移动"操作问题的更多相关文章

  1. std::move的原理与实现,右值引用的深入理解

    这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...

  2. 对C++11中的`移动语义`与`右值引用`的介绍与讨论

    本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap ...

  3. move语义和右值引用

    C++11支持move语义,用以避免非必要拷贝和临时对象. 具体内容见收藏中的“C++右值引用” .

  4. item 23: 理解std::move和std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...

  5. C++右值引用浅析

    一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...

  6. C++ 新特性 笔记 2 右值引用

    C ++ Rvalue引用说明 以下内容,主要是上述链接的摘要 介绍 Rvalue引用是C ++的一个特性,它是随C ++ 11标准添加的.使右值参考有点难以理解的是,当你第一次看到它们时,不清楚它们 ...

  7. 第16课 右值引用(3)_std::forward与完美转发

    1. std::forward原型 template <typename T> T&& forward(typename std::remove_reference< ...

  8. (转)C++11使用emplace_back代替push_back (其中有关于右值引用)

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

  9. 第15课 右值引用(2)_std::move和移动语义

    1. std::move (1)std::move的原型 template<typename T> typename remove_reference<T>::type& ...

随机推荐

  1. Min_25 筛与杜教筛

    杜教筛 \(\) 是 \(\) 的前缀和,\(\), \(\) 同理. 假设 \( × = ℎ\) ,并且 \(, \) 易求出,\(\) 难求出. 那么 \[H () = \sum_{ \cdot ...

  2. 初始化二维列表时使用[ [0]* N ] * K会出现的问题

    声明二维列表使用[ [0]* N ] * K会出现的问题 初始化二维列表时使用[ [0]* N ] * K创建,外层列表的每一个元素地址相同: 创造了一个二维列表: 修改其中的一个元素a[1][1], ...

  3. 挑战30天写操作系统-day4-C语言与画面显示的练习

    目录 获取源码关注公众号<猿小龙> 1.用C语言实现内存写入(harib01a) C语言中如果使用了write_mem8函数,就会跳转到_write_mem8,此时参数指定的数字就存放在内 ...

  4. Linux教我们丢掉键盘

    前言 本篇博客并非博主编写,而是跟着黑马教程整理的. 因为Linux都是一些操作命令,也不想深入研究,所以就用此博客记录一下平时的基本知识,方便日后查找. 一.常用命令 命令 对应英文 作用 ls l ...

  5. 解决报错ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code

    问题的由来 MySQL服务没有正常关机,是电脑没电后自动关机产生,记录一下排查过程 1.本以为是pid的问题,上网找了教程,解决不了,然后看日志看了网上各种说是数据库内存溢出 2021-03-12T1 ...

  6. 多校B层冲刺NOIP20211111模拟12

    题面:PDFhttp://xn--gwt928b.accoders.com/pdf/10248/10248.pdfhttp://xn--gwt928b.accoders.com/pdf/10248/1 ...

  7. MD5,Des,RSA加密解密

    一.加密和解密 下面先熟悉几个概念 1>对称加密:加密的key和解密的key是同一个 但是如何确保密钥安全地进行传递?秘钥的安全是一个问题 2>非对称加密:加密点的key和解密的key不是 ...

  8. SQL Server、MySQL主从搭建,EF Core读写分离代码实现

    一.SQL Server的主从复制搭建 1.1.SQL Server主从复制结构图 SQL Server的主从通过发布订阅来实现 1.2.基于SQL Server2016实现主从 新建一个主库&quo ...

  9. JS 字符串转 GBK 编码超精简实现

    前言 JS 中 GBK 编码转字符串是非常简单的,直接调用 TextDecoder 即可: const gbkBuf = new Uint8Array([196, 227, 186, 195, 49, ...

  10. selenium基本用法

    一.元素操作 send_keys:赋值 clear:清空 click:点击 from selenium import webdriver from selenium.webdriver.common. ...