C++ 0x unique_ptr取代scoped_ptr取得所有权?

Nei*_*l G 19 c++ smart-pointers c++11

我曾经写过这样的代码:

class P {};

class Q: public P {};

class A {
    // takes ownership
    A(P* p): p_(p) {}

    scoped_ptr<P> p_;
};

A a(new Q);
Run Code Online (Sandbox Code Playgroud)

使用C++ 0x,我应该将A类重写为:

class A {
    // takes ownership
    A(unique_ptr<P>&& p): p_(p) {}

    unique_ptr<P> p_;
};
Run Code Online (Sandbox Code Playgroud)

How*_*ant 42

我赞成了comonad的答案,但有一点需要注意:

每当你想明确地 禁止移动语义时,使用a使用scoped_ptrconst unique_ptr.

我没有遇到任何一个const std::unique_ptr不如a的用例boost::scoped_ptr.但是我对这个问题的教育持开放态度.

编辑:

这是一个用例boost::scoped_ptr,我认为应该失败,但不是.它确实失败了std::unique_ptr:

#include <iostream>

#ifdef USE_UNIQUEPTR

#include <memory>
typedef std::unique_ptr<int> P;

#else  // USE_UNIQUEPTR

#include <boost/scoped_ptr.hpp>
typedef boost::scoped_ptr<int> P;

#endif  // USE_UNIQUEPTR

int main()
{
    P p1(new int(1));
    {
        // new scope
#ifdef USE_UNIQUEPTR
        const P p2(new int(2));
#else  // USE_UNIQUEPTR
        P p2(new int(2));
#endif  // USE_UNIQUEPTR
        swap(p1, p2);  // should fail!
    }
    std::cout << *p1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

如果承诺的boost::scoped_ptr是它的资源不会逃避当前的范围,那么它就不能把这个承诺当作一个const std::unique_ptr.如果我们想将const boost :: scoped_ptr与const :: std :: unique_ptr进行比较,我不得不问:出于什么目的?它们对我来说似乎是一样的,除了const std :: unique_ptr允许自定义构造和销毁.


com*_*nad 30

  • 一个auto_ptr的是一个指针 复制使用 移动语义和所有权(=自动删除).
  • 的unique_ptr是一个auto_ptr的 不复制,但 移动语义.
  • 一个使用scoped_ptrauto_ptr的 不复制不动语义.

    auto_ptr s总是一个糟糕的选择 - 这很明显.

    每当你想明确地具有移动语义,使用的unique_ptr.

    每当您想明确禁止移动语义时,请使用scoped_ptr.

  • 所有指针都允许交换语义,例如p.swap(q).要禁止那些,请使用任何const ... _ptr.

在某些情况下,您希望使用指向几个可互换对象之一的scoped_ptr:由于缺少移动语义,因此非常安全(就显而易见的错误而言)它不会意外地指向null移动.值得一提的是:scoped_ptr仍然可以有效地交换掉.要使它可移动和/或可复制 - 但仍然使用这些交换语义 - 您可能需要考虑使用指向指向可交换(通过scoped_ptr :: swap)对象的scoped_ptrshared_ptr.

有关详细信息,请参阅stackoverflow:smart-pointers-boost-explanation.