fork download
  1. #include<iostream>
  2.  
  3. struct Test {
  4. Test() {std::cout << "Constructed.\n";}
  5. ~Test() {std::cout << "Destructed.\n";}
  6. Test(Test const&) {std::cout << "Copy-Constructed.\n";}
  7. Test(Test &&) {std::cout << "Move-Constructed.\n";}
  8. Test & operator=(Test const&) {std::cout << "Copy-Assigned.\n"; return *this;}
  9. Test & operator=(Test &&) {std::cout << "Move-Assigned.\n"; return *this;}
  10. };
  11.  
  12. int main() {
  13. std::cout << "Test t;\n";
  14. Test t; //Construction
  15. std::cout << "Test t2(t);\n";
  16. Test t2(t); //Copy-Construct
  17. std::cout << "Test t3(std::move(t2));\n";
  18. Test t3(std::move(t2)); //Move-Construct
  19. std::cout << "Test t4 = t;\n";
  20. Test t4 = t; //Copy Construct, due to Copy Ellision
  21. std::cout << "Test t5 = Test();\n";
  22. Test t5 = Test(); //Will probably be a normal Construct, due to Copy Ellision
  23. std::cout << "t = t2;\n";
  24. t = t2; //Copy Assign
  25. std::cout << "t = Test();\n";
  26. t = Test(); //Move Assign, will invoke Constructor and Destructor on temporary
  27. std::cout << "Done! Cleanup will now happen!\n";
  28. return 0;
  29. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Test t;
Constructed.
Test t2(t);
Copy-Constructed.
Test t3(std::move(t2));
Move-Constructed.
Test t4 = t;
Copy-Constructed.
Test t5 = Test();
Constructed.
t = t2;
Copy-Assigned.
t = Test();
Constructed.
Move-Assigned.
Destructed.
Done! Cleanup will now happen!
Destructed.
Destructed.
Destructed.
Destructed.
Destructed.