File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -267,16 +267,26 @@ int main()
267267class A {
268268public:
269269 int *pointer;
270- A():pointer(new int(1)) { std::cout << "构造" << pointer << std::endl; }
271- A(A& a):pointer(new int(*a.pointer)) { std::cout << "拷贝" << pointer << std::endl; } // 无意义的对象拷贝
272- A(A&& a):pointer(a.pointer) { a.pointer = nullptr;std::cout << "移动" << pointer << std::endl; }
273- ~A(){ std::cout << "析构" << pointer << std::endl; delete pointer; }
270+ A():pointer(new int(1)) {
271+ std::cout << "构造" << pointer << std::endl;
272+ }
273+ A(A& a):pointer(new int(*a.pointer)) {
274+ std::cout << "拷贝" << pointer << std::endl;
275+ } // 无意义的对象拷贝
276+ A(A&& a):pointer(a.pointer) {
277+ a.pointer = nullptr;
278+ std::cout << "移动" << pointer << std::endl;
279+ }
280+ ~A(){
281+ std::cout << "析构" << pointer << std::endl;
282+ delete pointer;
283+ }
274284};
275285// 防止编译器优化
276286A return_rvalue(bool test) {
277287 A a,b;
278- if(test) return a;
279- else return b;
288+ if(test) return a; // 等价于 static_cast<A&&>(a);
289+ else return b; // 等价于 static_cast<A&&>(b);
280290}
281291int main() {
282292 A obj = return_rvalue(false);
Original file line number Diff line number Diff line change 1010class A {
1111public:
1212 int *pointer;
13- A ():pointer(new int (1 )) { std::cout << " 构造" << pointer << std::endl; }
14- A (A& a):pointer(new int (*a.pointer)) { std::cout << " 拷贝" << pointer << std::endl; } // 无意义的对象拷贝
15- A (A&& a):pointer(a.pointer) { a.pointer = nullptr ;std::cout << " 移动" << pointer << std::endl; }
16- ~A (){ std::cout << " 析构" << pointer << std::endl; delete pointer; }
13+ A ():pointer(new int (1 )) {
14+ std::cout << " 构造" << pointer << std::endl;
15+ }
16+ A (A& a):pointer(new int (*a.pointer)) {
17+ std::cout << " 拷贝" << pointer << std::endl;
18+ } // 无意义的对象拷贝
19+ A (A&& a):pointer(a.pointer) {
20+ a.pointer = nullptr ;
21+ std::cout << " 移动" << pointer << std::endl;
22+ }
23+ ~A (){
24+ std::cout << " 析构" << pointer << std::endl;
25+ delete pointer;
26+ }
1727};
1828// 防止编译器优化
1929A return_rvalue (bool test) {
2030 A a,b;
21- if (test) return a;
22- else return b;
31+ if (test) return a; // 等价于 static_cast<A&&>(a);
32+ else return b; // 等价于 static_cast<A&&>(b);
2333}
2434int main () {
2535 A obj = return_rvalue (false );
2636 std::cout << " obj:" << std::endl;
2737 std::cout << obj.pointer << std::endl;
2838 std::cout << *obj.pointer << std::endl;
29-
3039 return 0 ;
31- }
40+ }
You can’t perform that action at this time.
0 commit comments