Выбор ответа Junior RAII и умные указатели спрашивают часто обновлено

Копирование unique_ptr

Вопрос

Что будет при попытке auto q = p;, где p это std::unique_ptr<Widget>?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ошибка компиляции: копирование удалено, нужно std::move(p). uniqueptr выражает единоличное владение: копирование запрещено (= delete), разрешено только перемещение, после которого источник пуст. - Совместное владение даёт sharedptr. - Глубокого копирования умные указатели не делают. - Молчаливая…

Варианты ответа

  1. Оба указателя будут владеть объектом, счётчик станет равен 2
  2. Объект Widget скопируется глубоко через его конструктор копирования
  3. p станет пустым, а владение перейдёт к q, как у старого auto_ptr
  4. Ошибка компиляции: копирование удалено, нужно std::move(p)правильный ответ

Разбор

unique_ptr выражает единоличное владение: копирование запрещено (= delete), разрешено только перемещение, после которого источник пуст.

  • Совместное владение даёт shared_ptr.
  • Глубокого копирования умные указатели не делают.
  • Молчаливая передача владения при копировании была у std::auto_ptr, его удалили в C++17 как раз из-за этого.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.