fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. class fast_arg
  5. {
  6. public:
  7. fast_arg(const T & val)
  8. : lval_(&val), rval_(nullptr) {}
  9. fast_arg(T &&val)
  10. : lval_(nullptr), rval_(&val) {}
  11.  
  12. void copy_to(T &target)
  13. {
  14. if (lval_) target = *lval_;
  15. else target = std::move(*rval_);
  16. }
  17.  
  18. private:
  19. const T *lval_;
  20. T *rval_;
  21. };
  22.  
  23. class logged_creation
  24. {
  25. public:
  26. logged_creation() {std::cout << "def ctor\n";}
  27. logged_creation(const logged_creation &) {std::cout << "copy ctor\n";}
  28. logged_creation(logged_creation &&) {std::cout << "move ctor\n";}
  29. logged_creation& operator = (const logged_creation &) {std::cout << "copy assignment\n";}
  30. logged_creation& operator = (logged_creation &&) {std::cout << "move assignment\n";}
  31. };
  32.  
  33. template <typename T>
  34. class foo
  35. {
  36. public:
  37. void func(fast_arg<T> val)
  38. {
  39. T v;
  40. val.copy_to(v);
  41. }
  42. };
  43.  
  44. int main()
  45. {
  46. foo<logged_creation> f;
  47. std::cout << "LValue:\n";
  48. logged_creation i;
  49. f.func(i);
  50. std::cout << "RValue:\n";
  51. f.func(logged_creation());
  52. }
  53.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
LValue:
def ctor
def ctor
copy assignment
RValue:
def ctor
def ctor
move assignment