41
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;

ここでは、p2も参照しているため、p1は「一意」ではなくなっているようです。

それは合法的なC++ですか?unique_ptrにはcopy_semanticsがありますか?いいえの場合、および移動セマンティクスしかない場合、p2に割り当てた後にp1はNULLに設定されますか?

編集:

わかりました。正しいバージョンは

 p2=std::move(p1)

それによると、この割り当ての後、p1は無効ですか?そして、auto_ptrとの違いはここにありますか?auto_ptrの場合のように、暗黙的に所有権の譲渡を明示的に指定するよりも安全です。

4

3 に答える 3

67

std :: unique_ptrは、割り当ておよびコピーできません。std :: move();を使用する必要があります。

それで

p1 = std::move(p2);

詳細については、こちらをご覧ください。

于 2011-04-11T14:31:34.743 に答える
12

これが私が書いたあなたの質問に答える記事です。私はもともと、unique_ptrのエミュレーションを提示するためにこの記事を書きました。ただし、エミュレーションを扱う最初の数段落は無視して、「基本的な例」から読み始めることができます。

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

編集:

上記のリンクされた記事を、この形式で実用的な答えを出すのに十分小さいものに抽出するのに苦労しました。ただし、これが私のベストショットです。

理由:ジェネリックコードの安全性。auto_ptrまたはのいずれかのコピーを実際に作成することはできませんunique_ptr。検討:

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

ジェネリックコードが上記のように見えることはまったく珍しいことではありませんfooassertおそらく実際にはそこにはありませんが、がしばしば成り立つという仮定 は assertそこにあります... 暗黙的に。確かに、の人気のある実装はstd::sort、1996年にまさにこのロジックを持っていました。これは、2回目の auto_ptr再設計を促したものです(これは役に立ちましたが、問題を完全には修正しませんでした)。

于 2011-04-11T15:07:24.923 に答える
3

これによると、p2=p1コンパイルエラーです。

于 2011-04-11T14:31:45.727 に答える