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. template <typename T1>
  13. fast_arg(T1 &&val)
  14. : lval_(nullptr), rval_(nullptr)
  15. {
  16. static T temp(std::forward<T1>(val));
  17. rval_ = &temp;
  18. }
  19.  
  20. void copy_to(T &target)
  21. {
  22. if (lval_) target = *lval_;
  23. else target = std::move(*rval_);
  24. }
  25.  
  26. T create_as_copy()
  27. {
  28. if (lval_) return *lval_;
  29. else return std::move(*rval_);
  30. }
  31.  
  32. private:
  33. const T *lval_;
  34. T *rval_;
  35. };
  36.  
  37. class logged_creation
  38. {
  39. public:
  40. logged_creation() {std::cout << "def ctor\n";}
  41. logged_creation(int) {std::cout << "int ctor\n";}
  42. logged_creation(const logged_creation &) {std::cout << "copy ctor\n";}
  43. logged_creation(logged_creation &&) {std::cout << "move ctor\n";}
  44. logged_creation& operator = (const logged_creation &) {std::cout << "copy assignment\n";}
  45. logged_creation& operator = (logged_creation &&) {std::cout << "move assignment\n";}
  46. };
  47.  
  48. template <typename T>
  49. class foo
  50. {
  51. public:
  52. void func(fast_arg<T> val)
  53. {
  54. auto v = val.create_as_copy();
  55. }
  56. };
  57.  
  58. int main()
  59. {
  60. foo<logged_creation> f;
  61. std::cout << "LValue:\n";
  62. logged_creation i;
  63. f.func(i);
  64. std::cout << "RValue:\n";
  65. f.func(logged_creation());
  66. std::cout << "Converted Temporary:\n";
  67. f.func(42);
  68. }
  69.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
LValue:
def ctor
copy ctor
move ctor
RValue:
def ctor
move ctor
Converted Temporary:
int ctor
move ctor