首页 > 编程语言 >C++11——3.21-3.22 move,forward

C++11——3.21-3.22 move,forward

时间:2023-09-04 19:45:24浏览次数:38  
标签:11 右值 move 左值 C++ 3.21 3.22 forward

★★★原文链接★★★:https://subingwen.cn/cpp/move-forward/

  • 3.21 move 资源的转移
  • 3.22 forward 完美转发
  • 3.21 move资源的转移
  • move方法可以将左值转换为右值
  • 使用这个函数并不能移动任何东西,它将一个对象的所有权从这个对象转移到另一个对象,只是转移,没有内存拷贝。

move 语法:

右值引用 = move(左值)

 

示例:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Test {
 5 public:
 6     // 默认构造函数
 7     Test() :m_num(new int(100))
 8     {
 9         cout << "construct: my name is jerry" << endl;
10         cout << "m_num地址:" << &m_num << endl;
11     }
12     // 拷贝构造函数
13     Test(const Test& a) :m_num(new int(*a.m_num))
14     {
15         cout << "copy construct: my name is tom" << endl;
16     }
17     // 移动构造函数 
18     Test(Test&& a) :m_num(a.m_num)
19     {
20         a.m_num = nullptr;    
21         cout << "move construct..." << endl;
22     }
23     // 析构
24     ~Test() {
25         cout << "destruct Test class..." << endl;
26         delete m_num;
27     }
28 
29     int* m_num;
30 };
31 
32 int main() {
33     Test t;
34     cout << "*(t.m_num) = " << *(t.m_num) << endl;
35     // Test&& v1 = t;    // error,t是左值
36     Test&& v2 = move(t);
37     cout << "*(v2.m_num) = " << *(v2.m_num) << endl;
38     cout << "*(t.m_num) = " << *(t.m_num) << endl;
39     cout << "&v2.m_num = " << &v2.m_num << endl;
40     cout << "&t.m_num = " << &t.m_num << endl;
41 
42     return 0;
43 }

res:

  

从运行结果可以看到 整个过程只调用了一次普通构造函数,给 v2 进行赋值时没有调用任何构造函数;

v2 的 m_num 和 t 的 m_num 的地址相同。

 

  • 3.22 forward 完美转发

forward 函数作用:保证右值引用在传递过程中,类型不发生变化(不会变成左值引用);该函数实现的功能称为完美转发。

语法:

forward<T>(t);
  • 当 T 为左值引用类型时,t 将被转换为 T 类型的左值
  • 当 T 不是左值引用类型时,t 将被转换为 T 类型的右值

原文讲的非常清楚

★★★原文链接★★★:https://subingwen.cn/cpp/move-forward/

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

标签:11,右值,move,左值,C++,3.21,3.22,forward
From: https://www.cnblogs.com/wjjgame/p/17677926.html

相关文章

  • 1141 PAT Ranking of Institutions(附测试点5分析)
    题目:AftereachPAT,thePATCenterwillannouncetherankingofinstitutionsbasedontheirstudents'performances.Nowyouareaskedtogeneratetheranklist.InputSpecification:Eachinputfilecontainsonetestcase.Foreachcase,thefirstline......
  • window11 增加右键用 vscode 打开文件夹或文件
    一、win+R输入regedit,打开注册表编辑器二、添加右键文件夹打开命令找到HKEY_CLASSES_ROOT>Directory>shell右键shell,新建项VSCode,点击VSCode文件夹,双击右边的"默认",输入OpenwithVSCode右键VSCode文件夹,新建字符串值,双击右侧的“新值”,输入VSCode文件所在......
  • 如何通过C++开发高效的机器人控制程序
    如何通过C++开发高效的机器人控制程序导语:随着人工智能和机器人技术的不断发展,机器人控制程序的开发变得越来越重要。本文将介绍如何使用C++语言开发高效的机器人控制程序,并提供一些代码示例。一、了解机器人的控制原理在开始开发机器人控制程序之前,首先需要了解机器人的控制原......
  • 《c++高级编程》笔记--内存管理
    作者:fbysss关键字:C++内存管理《c++高级编程》笔记1.new关键字使用关键字new时,内存是在堆(heap)里分配的,不使用new,内存是在堆栈(stack)分配的。句柄handle一般用来描述一个指针的指针。之所以使用“句柄”,是因为句柄允许底层软件在必要时移动内存。使用new的时候,会返回一个指针,并且......
  • 1142 Maximal Clique(附测试点1,3错误分析)
    题目:A clique isasubsetofverticesofanundirectedgraphsuchthateverytwodistinctverticesinthecliqueareadjacent.A maximalclique isacliquethatcannotbeextendedbyincludingonemoreadjacentvertex.(Quotedfromhttps://en.wikipedia.or......
  • Oracle-TableSpace Move To
    SELECTowner,segment_name,partition_name,tablespace_name,'ALTERTABLE'||a.segment_name||'movePARTITION'||a.partition_name||'tablespaceTESTDB;'FROMdba_segmentsaWHERE1=1--ANDowner='TEST'--A......
  • ZLMeidaKit在Windows上启动时:计算机中丢失MSVCR110.dll,以及rtmp推流后无法转换为flv
    场景ZLMediaKit在Windows上实现Rtmp流媒体服务器以及模拟rtmp推流和http-flv拉流播放:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130221608按照以上教程启动MediaServer.exe时提示:无法启动此程序,因为计算机中缺失MSVCR110.dll,尝试重新安装程序以解决此问题......
  • C++11——3.17-3.20 右值引用
    ★★★原文链接★★★:https://subingwen.cn/cpp/rvalue-reference/3.17.右值和右值引用3.18.右值引用的作用以及使用3.19.未定引用类型的推导3.20.右值引用的传递3.17.右值和右值引用左值,lvalue,locatorvalue,(locator:定位器)右值,rvalue,readvalue,(read:只读)右值分为纯......
  • Linux 服务器下C++开发找不到mysql.h
    问题背景腾讯云服务器,linuxcentOS7内核,mysql版本5.5为宝塔腾讯云版自动安装C++用cmake编译时找不到mysql.h解决1.首先尝试yum安装mysql-devel包,但是yum让我直接下载了mariadb相关的包,下载时它,与原有包冲突bt-mysql55-5.5.62-1.el7.x86_64,但是删除原有包后mysql启动有问......
  • BUUCTF [CISCN2019 华东南赛区]Web11
    切入点如图:测试模板注入最后或者payload:X-Forwarded-For:{ifreadfile('/flag')}{/if}原理是Smarty已经废弃{php}标签。在Smarty3.1,{php}仅在SmartyBC中可用。Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}。全部的PHP条件表......