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