использование std :: unique_ptr - PullRequest
41 голосов
/ 11 апреля 2011
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;

Здесь кажется, что p1 больше не является "уникальным", так как p2 ссылается на него также

Это допустимо с ++?Есть ли у unique_ptr copy_semantics?Если нет, и если он имеет только семантику перемещения, устанавливается ли p1 в NULL после назначения его p2?

РЕДАКТИРОВАТЬ:

ок, поэтому правильная версия

 p2=std::move(p1)

В соответствии с этим, после этого присвоения, p1 недействителен?А разница с auto_ptr здесь?более безопасно явно указать передачу права собственности, чем неявно, как это имеет место с auto_ptr, я думаю

Ответы [ 3 ]

67 голосов
/ 11 апреля 2011

std :: unique_ptr не назначается и не копируется. Вам нужно использовать std :: move ();

так

p1 = std::move(p2);

Посмотрите здесь для получения дополнительной информации.

12 голосов
/ 11 апреля 2011

Вот статья, которую я написал, которая отвечает на ваши вопросы. Я изначально написал эту статью, чтобы представить эмуляцию unique_ptr. Однако вы можете проигнорировать первые несколько абзацев, касающихся эмуляции, и просто начать читать «Основные примеры».

http://howardhinnant.github.io/unique_ptr03.html

Edit:

У меня были проблемы с дистилляцией вышеупомянутой связанной статьи до чего-то достаточно маленького, чтобы дать практический ответ в этом формате. Однако вот мой лучший снимок:

Причина: безопасность в общем коде. Нельзя реально сделать копии либо auto_ptr, либо unique_ptr. Рассмотрим:

template <class T>
void foo(T t)
{
    T copy_of_t = t;  // line 4
    assert(copy_of_t == t);
}

Это не совсем необычно для универсального код выглядит как foo выше. assert, вероятно, на самом деле не там, но предположение, что assert будет часто держаться там ... неявно . Действительно, популярная реализация std::sort имела именно эта логика в 1996 году, которая именно то, что побудило второго auto_ptr редизайн (который помог, но не полностью решил проблему).

3 голосов
/ 11 апреля 2011

Согласно это , p2=p1 - ошибка компиляции.

...