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

发布时间 2023-09-04 19:41:40作者: 我会变强的

★★★原文链接★★★: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/

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