update: more explaination on move proposal

This commit is contained in:
Changkun Ou
2019-06-05 14:11:55 +02:00
parent 07badc85f7
commit 5c37806f62
2 changed files with 33 additions and 14 deletions

View File

@@ -267,16 +267,26 @@ int main()
class A { class A {
public: public:
int *pointer; int *pointer;
A():pointer(new int(1)) { std::cout << "构造" << pointer << std::endl; } A():pointer(new int(1)) {
A(A& a):pointer(new int(*a.pointer)) { std::cout << "拷贝" << pointer << std::endl; } // 无意义的对象拷贝 std::cout << "构造" << pointer << std::endl;
A(A&& a):pointer(a.pointer) { a.pointer = nullptr;std::cout << "移动" << pointer << std::endl; } }
~A(){ std::cout << "析构" << pointer << std::endl; delete pointer; } A(A& a):pointer(new int(*a.pointer)) {
std::cout << "拷贝" << pointer << std::endl;
} // 无意义的对象拷贝
A(A&& a):pointer(a.pointer) {
a.pointer = nullptr;
std::cout << "移动" << pointer << std::endl;
}
~A(){
std::cout << "析构" << pointer << std::endl;
delete pointer;
}
}; };
// 防止编译器优化 // 防止编译器优化
A return_rvalue(bool test) { A return_rvalue(bool test) {
A a,b; A a,b;
if(test) return a; if(test) return a; // 等价于 static_cast<A&&>(a);
else return b; else return b; // 等价于 static_cast<A&&>(b);
} }
int main() { int main() {
A obj = return_rvalue(false); A obj = return_rvalue(false);

View File

@@ -10,22 +10,31 @@
class A { class A {
public: public:
int *pointer; int *pointer;
A():pointer(new int(1)) { std::cout << "构造" << pointer << std::endl; } A():pointer(new int(1)) {
A(A& a):pointer(new int(*a.pointer)) { std::cout << "拷贝" << pointer << std::endl; } // 无意义的对象拷贝 std::cout << "构造" << pointer << std::endl;
A(A&& a):pointer(a.pointer) { a.pointer = nullptr;std::cout << "移动" << pointer << std::endl; } }
~A(){ std::cout << "析构" << pointer << std::endl; delete pointer; } A(A& a):pointer(new int(*a.pointer)) {
std::cout << "拷贝" << pointer << std::endl;
} // 无意义的对象拷贝
A(A&& a):pointer(a.pointer) {
a.pointer = nullptr;
std::cout << "移动" << pointer << std::endl;
}
~A(){
std::cout << "析构" << pointer << std::endl;
delete pointer;
}
}; };
// 防止编译器优化 // 防止编译器优化
A return_rvalue(bool test) { A return_rvalue(bool test) {
A a,b; A a,b;
if(test) return a; if(test) return a; // 等价于 static_cast<A&&>(a);
else return b; else return b; // 等价于 static_cast<A&&>(b);
} }
int main() { int main() {
A obj = return_rvalue(false); A obj = return_rvalue(false);
std::cout << "obj:" << std::endl; std::cout << "obj:" << std::endl;
std::cout << obj.pointer << std::endl; std::cout << obj.pointer << std::endl;
std::cout << *obj.pointer << std::endl; std::cout << *obj.pointer << std::endl;
return 0; return 0;
} }