C++0x unique_ptr replaces scoped_ptr taking ownership?

前端 未结 5 587
别跟我提以往
别跟我提以往 2020-12-08 21:24

I used to write code like this:

class P {};

class Q: public P {};

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

    scoped_ptr

p_; }; A

5条回答
  •  萌比男神i
    2020-12-08 22:00

    I've upvoted comonad's answer, but with a caveat:

    Whenever you want to explicitely disallow move semantics, use a scoped_ptr const unique_ptr.

    I have not come across any use cases where a const std::unique_ptr is inferior to a boost::scoped_ptr. However I'm open to education on the subject.

    Edit:

    Here is a use case of boost::scoped_ptr that I think should fail, but does not. It does fail for std::unique_ptr:

    #include 
    
    #ifdef USE_UNIQUEPTR
    
    #include 
    typedef std::unique_ptr P;
    
    #else  // USE_UNIQUEPTR
    
    #include 
    typedef boost::scoped_ptr 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';
    }
    

    If the promise of boost::scoped_ptr is that its resource will not escape the current scope, then it is not as good at holding that promise as a const std::unique_ptr. If we want to compare const boost::scoped_ptr to const::std::unique_ptr, I have to ask: for what purpose? They seem the same to me, except that a const std::unique_ptr allows customized construction and destruction.

提交回复
热议问题