#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct A_s {
    unsigned int l;
    int *arr;

    A_s(unsigned int size) : l(size), arr(new int[size])
    {
        cout<< "\t con addr: " << this << " Arr: " << arr <<endl;
    }
    A_s(const A_s &) = delete; // cannot copy
    A_s& operator=(const A_s &) = delete; // cannot assign

    A_s(A_s && src): l(src.l), arr(src.arr)
    {
        cout << "\t mov addr: " << this << " Arr: " << arr << " from " << &src <<endl;
        src.arr = nullptr;
        src.l = 0;
    }
    A_s& operator=(A_s && src)
    {
        std::swap(arr, src.arr);
        std::swap(l, src.l);
        cout << "\t ass addr: " << this << " Arr: " << arr << " from " << &src <<endl;
        return *this;
    }
    ~A_s() {
        if (arr != nullptr)
        {
            cout << "\t des addr: " << this << " Arr: " << arr << endl;
        }
        delete[] arr;               // works if line is removed
    }
};

vector<A_s> vec;

int main() {
    cout<<"vec 0"<<endl;
    vec.emplace_back(1);

    cout<<"vec 1"<<endl;
    vec.emplace_back(1);

    cout<<"vec 2"<<endl;
    vec.emplace_back(1);

    cout<<"vec 3"<<endl;
    vec.emplace_back(1);

    cout<<"Remove vec 1"<<endl;
    vec.erase(vec.begin());

    for(unsigned int i = 0; i < vec.size(); i++)
    cout<< "addr: " << &vec[i] << " Arr: " << vec[i].arr <<endl;

    cout<<"end"<<endl;
    return 0;
}
