fork(1) download
  1. #include <iostream>
  2.  
  3. class Data {
  4. public:
  5. Data(){ }
  6. Data(const Data& data) { std::cout << " copy constructor\n";}
  7. Data(Data&& data) { std::cout << " move constructor\n";}
  8. Data& operator=(const Data& data) { std::cout << " copy assignment\n"; return *this;}
  9. Data& operator=(Data&& data) { std::cout << " move assignment\n"; return *this;}
  10. };
  11.  
  12. class DataStore {
  13. Data data_;
  14. public:
  15. void setData(Data data) { data_ = std::move(data); }
  16. };
  17.  
  18. class UnmovableData {
  19. public:
  20. UnmovableData() { }
  21. UnmovableData(const UnmovableData& data) { std::cout << " copy constructor\n";}
  22. UnmovableData& operator=(const UnmovableData& data) { std::cout << " copy assignment\n"; return *this;}
  23. };
  24.  
  25. class UnmovableDataStore {
  26. UnmovableData data_;
  27. public:
  28. void setData(const UnmovableData& data) { data_ = data; }
  29. };
  30.  
  31. class UncopyableData {
  32. public:
  33. UncopyableData() { }
  34. UncopyableData(UncopyableData&& data) { std::cout << " move constructor\n";}
  35. UncopyableData& operator=(UncopyableData&& data) { std::cout << " move assignment\n"; return *this;}
  36. };
  37.  
  38. class UncopyableDataStore {
  39. UncopyableData data_;
  40. public:
  41. void setData(UncopyableData&& data) { data_ = std::move(data); }
  42. };
  43.  
  44. template<class D>
  45. class GenericDataStore {
  46. D data_;
  47. public:
  48. void setData(const D& data) { data_ = data; }
  49. void setData(D&& data) { data_ = std::move(data); }
  50. };
  51.  
  52. int main() {
  53. Data d;
  54. DataStore ds;
  55.  
  56. std::cout << "DataStore test:\n";
  57. ds.setData(d);
  58.  
  59. std::cout << "DataStore test with rvalue:\n";
  60. ds.setData(Data{});
  61.  
  62. Data d2;
  63. std::cout << "DataStore test with move:\n";
  64. ds.setData(std::move(d2));
  65.  
  66. std::cout << "UnmovableDataStore test:\n";
  67. UnmovableData umd;
  68. UnmovableDataStore umds;
  69. umds.setData(umd);
  70.  
  71. std::cout << "UncopyableDataStore test:\n";
  72. UncopyableData ucd;
  73. UncopyableDataStore ucds;
  74. ucds.setData(std::move(ucd));
  75.  
  76. std::cout << "GenericDataStore<Data> test:\n";
  77. Data d3;
  78. GenericDataStore<Data> gds;
  79. gds.setData(d3);
  80.  
  81. std::cout << "GenericDataStore<UnmovableData> test:\n";
  82. UnmovableData umd2;
  83. GenericDataStore<UnmovableData> gds3;
  84. gds3.setData(umd2);
  85.  
  86. std::cout << "GenericDataStore<UncopyableData> test:\n";
  87. UncopyableData ucd2;
  88. GenericDataStore<UncopyableData> gds2;
  89. gds2.setData(std::move(ucd2));
  90. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
DataStore test:
  copy constructor
  move assignment
DataStore test with rvalue:
  move assignment
DataStore test with move:
  move constructor
  move assignment
UnmovableDataStore test:
  copy assignment
UncopyableDataStore test:
  move assignment
GenericDataStore<Data> test:
  copy assignment
GenericDataStore<UnmovableData> test:
  copy assignment
GenericDataStore<UncopyableData> test:
  move assignment