forked from mrchuanxu/RegularNotes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rightRef.cpp
83 lines (78 loc) · 2.16 KB
/
rightRef.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
using namespace std;
/***
* 所以右值引用是独立于左值和右值
* 以下是一个好例子
* 放入一个左值,那么T&& t 就是一个左值
* 放入一个右值,那么T&& t 就是一个右值
* 这里发生了自动类型推断
* 是发生在函数中的
* 类型中
* 并没有类型的自动推断
* 所以当我们使用移动构造函数的时候,需要使用的移动运算符std::move
*
* **/
void processValue(int &a){cout <<"lvalue"<<endl;}
void processValue(int &&a){cout << "rvalue"<<endl;}
template<typename T> void func(T&& val){
processValue(std::forward(val)); // FIXME:
}
int && i = 0;
class Test{
public:
Test():m_ptr(new int[0]){
cout << "construct" << endl;
}
Test(const Test& test):m_ptr(new int(*test.m_ptr)){
cout << "deep copy" <<endl;
}
Test(Test&& test):m_ptr(test.m_ptr){ // 这里就一定是右值引用了
cout << "right move reference" << endl;
// delete test.m_ptr; ❌ 这里不允许删除一个右值
test.m_ptr = nullptr;
}
~Test(){
delete m_ptr;
cout << "delete"<<endl;
}
Test& operator=(const Test& test){ // 其实这里使用了深拷贝
if(this==&test)
return *this;
delete m_ptr;
Test *temptest;
temptest->m_ptr = test.m_ptr;
m_ptr = temptest->m_ptr;
delete test.m_ptr;
cout << "assign to other" <<endl;
return *this;
}
Test& operator=(Test&& test){
cout << "move function"<< endl;
if(this==&test)
return *this;
//delete m_ptr;
m_ptr = test.m_ptr;
test.m_ptr = nullptr;
return *this;
}
private:
int *m_ptr;
};
Test getA(){
Test test;
return test; // 这是一个临时量
}
int main(){
// cout << i << endl;
// int inum = 100;
// const int&& inumref = 100;
// func(inumref);
Test test;
Test movTest = std::move(getA()); // 调用移动构造函数 所以这里不需要再构造一次,直接用移动构造
// test = movTest;
test = std::move(getA()); // 这里
int i = 10;
func(i);
func(0);
return 0;
}