auto_ptr源码分析

源码如下:

template<class _Ty>
struct auto_ptr_ref
{    
    explicit auto_ptr_ref(_Ty * _Right): _Ref(_Right)
    {    // construct from generic pointer to auto_ptr ptr
    }
    _Ty * _Ref;    // generic pointer to auto_ptr ptr
};
template<class _Ty>
class auto_ptr
{    // wrap an object pointer to ensure destruction
public:
    typedef _Ty element_type;
    explicit auto_ptr(_Ty * _Ptr = nullptr) noexcept
        : _Myptr(_Ptr)
    {    // construct from object pointer

    }
    auto_ptr(auto_ptr& _Right) noexcept    //不能加const,是因为需要修改_Right中的内容,内存资源的转移
        : _Myptr(_Right.release())
    {    // construct by assuming pointer from _Right auto_ptr
    }
    auto_ptr(auto_ptr_ref<_Ty> _Right) noexcept
    {    // construct by assuming pointer from _Right auto_ptr_ref
        _Ty * _Ptr = _Right._Ref;
        _Right._Ref = nullptr;    // release old
        _Myptr = _Ptr;    // reset this
    }
    template<class _Other>
    operator auto_ptr<_Other>() noexcept
    {    // convert to compatible auto_ptr
        return (auto_ptr<_Other>(*this));
    }
    template<class _Other>
    operator auto_ptr_ref<_Other>() noexcept
    {    // convert to compatible auto_ptr_ref
        _Other * _Cvtptr = _Myptr;    // test implicit conversion
        auto_ptr_ref<_Other> _Ans(_Cvtptr);
        _Myptr = nullptr;    // pass ownership to auto_ptr_ref
        return (_Ans);
    }
    template<class _Other>
    auto_ptr& operator=(auto_ptr<_Other>& _Right) noexcept
    {    // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
    }
    template<class _Other>
    auto_ptr(auto_ptr<_Other>& _Right) noexcept
        : _Myptr(_Right.release())
    {    // construct by assuming pointer from _Right
    }

    auto_ptr& operator=(auto_ptr& _Right) noexcept
    {    // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
    }
    auto_ptr& operator=(auto_ptr_ref<_Ty> _Right) noexcept
    {    // assign compatible _Right._Ref (assume pointer)
        _Ty * _Ptr = _Right._Ref;
        _Right._Ref = 0;    // release old
        reset(_Ptr);    // set new
        return (*this);
    }
    ~auto_ptr() noexcept
    {    // destroy the object
        delete _Myptr;
    }
    _NODISCARD _Ty& operator*() const noexcept
    {    // return designated value
#if _ITERATOR_DEBUG_LEVEL == 2
        _STL_VERIFY(_Myptr, "auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
        return (*get());
    }
    _NODISCARD _Ty * operator->() const noexcept
    {    // return pointer to class object
#if _ITERATOR_DEBUG_LEVEL == 2
        _STL_VERIFY(_Myptr, "auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
        return (get());
    }
    _NODISCARD _Ty * get() const noexcept
    {    // return wrapped pointer
        return (_Myptr);
    }
    _Ty * release() noexcept
    {    // return wrapped pointer and give up ownership
        _Ty * _Tmp = _Myptr;
        _Myptr = nullptr;
        return (_Tmp);
    }
    void reset(_Ty * _Ptr = nullptr)
    {    // destroy designated object and store new pointer
        if (_Ptr != _Myptr)
            delete _Myptr;
        _Myptr = _Ptr;
    }
private:
    _Ty * _Myptr;    // the wrapped object pointer
};


看了这个源码,我一直在想struct auto_ptr_ref 这个是干什么用的?

查阅了网上的一些资源:

针对这种情况:auto_ptr<int> p(auto_ptr<int>(new int [10]));这个构造过程是咋玩的?

auto_ptr<int>(new int [10])会生成一个临时变量,按照c++的规则,变量不可能做右值。

因此编译器尝试着使用其他的函数进行构造,operator auto_ptr_ref<_Other>() noexcept使用到这个函数,返回一个auto_ptr_ref的对象,编译器再次尝试构造,之后使用auto_ptr(auto_ptr_ref<_Ty> _Right) noexcept构造函数来构造对象,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值