Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.
Реализация перемещающего конструктора в шаблоне SharedPointer
Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо добавить в шаблонный класс SharedPointer конструктор перемещения, который после перемещения обнуляет указатели у исходного объекта.
Ответ
Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.
Для полей T* resource и std::size_t* refCount внутри класса:
SharedPointer(SharedPointer&& other) noexcept
: resource(other.resource), refCount(other.refCount) {
other.resource = nullptr;
other.refCount = nullptr;
}
Число владельцев не меняется: владение переходит от other к новому объекту. Деструктор перемещённого объекта должен корректно обрабатывать nullptr и не уменьшать переданный счётчик. noexcept полезен в том числе контейнерам, выбирающим между перемещением и копированием.