fork(2) download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. using namespace std;
  5.  
  6. struct inner {
  7. inner () { cout << "constructing inner object at " << this << '\n'; }
  8.  
  9. ~inner () { cout << "destructing inner object at " << this << '\n'; }
  10.  
  11. inner operator + (const inner &) { return *this; }
  12. };
  13.  
  14. template <class T>
  15. class storage {
  16. public:
  17. size_t _size;
  18. unique_ptr<T[]> _Array;
  19. storage (size_t size = 2) : _size(size), _Array(new T[size]) {
  20. cout << "constructing storage object at " << this << '\n';
  21. }
  22.  
  23. ~storage () { cout << "destructing storage object at " << this << '\n'; }
  24.  
  25. storage (const storage &other) : _size(other._size), _Array(new T[other._size]) {
  26. for (size_t i = 0; i < _size; ++i)
  27. _Array[i] = other._Array[i];
  28.  
  29. cout << "constructing storage object via copy (l-ref) constructor at " << this << '\n';
  30. }
  31.  
  32. storage (storage &&other) {
  33. swap(*this, other);
  34. cout << "constructing storage object via move (r-ref) constructor at " << this << '\n';
  35. other._Array = nullptr, other._size = 0;
  36. }
  37.  
  38. storage &operator= (storage other) {
  39. swap(*this, other);
  40. }
  41.  
  42. friend void swap (storage &first, storage &second) {
  43. std::swap(first._Array, second._Array);
  44. std::swap(first._size, second._size);
  45. }
  46.  
  47. storage operator + (const storage &other) {
  48. storage tmp(_size + other._size);
  49. return tmp;
  50. // return storage(_size + other._size);
  51. }
  52. };
  53.  
  54. int main () {
  55. storage<inner> T;
  56. storage<inner> T2 (T + T);
  57. cout << "end of init.\n";
  58. return 0;
  59. }
Success #stdin #stdout 0s 3228KB
stdin
Standard input is empty
stdout
constructing inner object at 0x843800c
constructing inner object at 0x843800d
constructing storage object at 0xbf9943a0
constructing inner object at 0x843801c
constructing inner object at 0x843801d
constructing inner object at 0x843801e
constructing inner object at 0x843801f
constructing storage object at 0xbf9943a8
end of init.
destructing storage object at 0xbf9943a8
destructing inner object at 0x843801f
destructing inner object at 0x843801e
destructing inner object at 0x843801d
destructing inner object at 0x843801c
destructing storage object at 0xbf9943a0
destructing inner object at 0x843800d
destructing inner object at 0x843800c