fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. class T
  5. {
  6. public:
  7. T(const std::string& name): name_(name), copy_(0), move_(0){}
  8. T(const T& rhs)
  9. : name_(rhs.name_), copy_(rhs.copy_), move_(rhs.move_)
  10. {
  11. copy_++;
  12. }
  13. T(T&& rhs)
  14. : name_(rhs.name_), copy_(rhs.copy_), move_(rhs.move_)
  15. {
  16. swap(rhs);
  17. move_++;
  18. }
  19.  
  20. void swap(T& rhs)
  21. {
  22. std::swap(name_, rhs.name_);
  23. std::swap(copy_, rhs.copy_);
  24. std::swap(move_, rhs.move_);
  25. }
  26.  
  27. void op()
  28. {
  29. std::cout << name_ << "-copy: " << copy_
  30. << ", move: " << move_ << std::endl;
  31. }
  32. private:
  33. int copy_;
  34. int move_;
  35. std::string name_;
  36. };
  37.  
  38. T op1(const T& val) // pass by const reference
  39. {
  40. std::cout << "op1" << std::endl;
  41. T tmp(val); //copy ctor
  42. tmp.op();
  43. return tmp;
  44. }
  45.  
  46. T op2(T val) // pass by value
  47. {
  48. std::cout << "op2" << std::endl;
  49. val.op();
  50. return val;
  51. }
  52.  
  53. T op3(T&& val) // pass by rvalue reference
  54. {
  55. std::cout << "op3" << std::endl;
  56. val.op();
  57. return val;
  58. }
  59.  
  60. T op4(const T& val) // pass by const lvalue reference
  61. {
  62. std::cout << "op4 [A]" << std::endl;
  63. T tmp(val);
  64. tmp.op();
  65. return tmp;
  66. }
  67. T op4(T&& val) // pass by rvalue reference
  68. {
  69. std::cout << "op4 [B]" << std::endl;
  70. val.op();
  71. return val;
  72. }
  73.  
  74. T op5(const T& val) // pass by const lvalue reference
  75. {
  76. std::cout << "op5 [A]" << std::endl;
  77. T tmp(val);
  78. tmp.op();
  79. return tmp;
  80. }
  81. T op5(T&& val) // pass by rvalue reference
  82. {
  83. std::cout << "op5 [B]" << std::endl;
  84. val.op();
  85. return std::move(val);
  86. }
  87.  
  88.  
  89. int main( int argc, char* argv[] )
  90. {
  91. T t("lvalue");
  92.  
  93. op1(t).op();
  94. T t1("xvalue");
  95. op1(std::move(t1)).op();
  96. op1(T("rvalue")).op();
  97.  
  98. op2(t).op();
  99. T t2("xvalue");
  100. op2(std::move(t2)).op();
  101. op2(T("rvalue")).op();
  102.  
  103. //op3(t).op(); //error
  104. T t3("xvalue");
  105. op3(std::move(t3)).op();
  106. op3(T("rvalue")).op();
  107.  
  108. op4(t).op();
  109. T t4("xvalue");
  110. op4(std::move(t4)).op();
  111. op4(T("rvalue")).op();
  112.  
  113. op5(t).op();
  114. T t5("xvalue");
  115. op5(std::move(t5)).op();
  116. op5(T("rvalue")).op();
  117.  
  118. return 0;
  119. }
Success #stdin #stdout 0s 3072KB
stdin
Standard input is empty
stdout
op1
lvalue-copy: 1, move: 0
lvalue-copy: 1, move: 0
op1
xvalue-copy: 1, move: 0
xvalue-copy: 1, move: 0
op1
rvalue-copy: 1, move: 0
rvalue-copy: 1, move: 0
op2
lvalue-copy: 1, move: 0
lvalue-copy: 2, move: 0
op2
xvalue-copy: 0, move: 1
xvalue-copy: 1, move: 1
op2
rvalue-copy: 0, move: 0
rvalue-copy: 1, move: 0
op3
xvalue-copy: 0, move: 0
xvalue-copy: 1, move: 0
op3
rvalue-copy: 0, move: 0
rvalue-copy: 1, move: 0
op4 [A]
lvalue-copy: 1, move: 0
lvalue-copy: 1, move: 0
op4 [B]
xvalue-copy: 0, move: 0
xvalue-copy: 1, move: 0
op4 [B]
rvalue-copy: 0, move: 0
rvalue-copy: 1, move: 0
op5 [A]
lvalue-copy: 1, move: 0
lvalue-copy: 1, move: 0
op5 [B]
xvalue-copy: 0, move: 0
xvalue-copy: 0, move: 1
op5 [B]
rvalue-copy: 0, move: 0
rvalue-copy: 0, move: 1