fork download
  1. #include <iostream>
  2.  
  3. #define LAZY
  4.  
  5. class Int
  6. {
  7. int n_;
  8.  
  9. public:
  10. explicit Int(int n) noexcept : n_(n) { std::cout << "Int(" << n_ << ")\n"; }
  11.  
  12. Int(Int const & rhs) : n_(rhs.n_) { std::cout << "Int(Int const &)[" << n_ << "]\n"; }
  13. Int(Int && rhs) : n_(rhs.n_) { std::cout << "Int(Int &&) [" << n_ << "]\n"; }
  14.  
  15. ~Int() { std::cout << "~Int()[" << n_ << "]\n"; }
  16.  
  17. Int & operator+=(Int const & rhs) { n_ += rhs.n_; return *this; }
  18. Int & operator+=(Int && rhs) { n_ += rhs.n_; return *this; }
  19.  
  20. #ifdef LAZY
  21. Int operator+(Int rhs) { return Int(*this) += std::move(rhs); }
  22. #else
  23. Int operator+(Int const & rhs) { Int result(*this); result += rhs; return result; }
  24. Int operator+(Int && rhs) { Int result(*this); result += std::move(rhs); return result; }
  25. #endif
  26. };
  27.  
  28.  
  29. int main()
  30. {
  31. auto x = Int(10) + Int(20) + Int(30);
  32. }
  33.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
Int(30)
Int(20)
Int(10)
Int(Int const &)[10]
Int(Int const &)[30]
~Int()[30]
Int(Int const &)[30]
Int(Int const &)[60]
~Int()[60]
~Int()[30]
~Int()[10]
~Int()[20]
~Int()[30]
~Int()[60]