внутри копирующие конструктор и равно придется писать самому, а мув версии можно = default оставить?
А копирование точно верная семантика для такого класса?)
Создать там новый указатель на новые данные
а как вы копировать собираетесь?
а вам точно юник нужен?
Deep copy в новый указатель
Если у вас нет разных видов наследников, то зачем вам юник, храните просто сам класс. Если есть, то как вы правильный тип узнаете? Обычно для таких случаев заводят метод clone условный
Я про условно class Array { unique_ptr<T> data_; … }
зачем вам тут юник?
Чтобы не писать правило 5)
Так это верно?
нет неправильно. Смотря какой умный указатель.
Юник без move не скопируешь.
Так копировать-то я буду данные из него в новый юник
вот тут копируем класс, который данные держит в юник поинтере template <typename T> class vector { public: explicit vector(int size) : my_size{size}, data{new T[my_size]} { } vector(const vector &that) : my_size{that.my_size}, data{new T[my_size]} { std::copy(&that.data[0], &that.data[that.my_size], &data[0]); } int size() const { return my_size; } const T &operator[](int i) const { check_index(i); return data[i]; } // ... private: int my_size; std::unique_ptr<T[]> data; };
Лучше данные держать в контейнере, он сам умеет копироваться, а когда данные держим в указателе, то надо его копировать уже самим нам. True Rule-of-Zero vector class Vec { std::vector<int> vec_; Vec(const Vec &rhs) = default; Vec(Vec &&rhs) noexcept = default; Vec &operator=(const Vec &rhs) = default; Vec &operator=(Vec &&rhs) = default; ~Vec() = default; void swap(Vec &rhs) noexcept { vec_.swap(rhs.vec_); } friend void swap(Vec &a, Vec &b) noexcept { a.swap(b); } };
Это не верно, кстати, а скорее отсутствующий в стл фиксед аррей
Обсуждают сегодня