C++-C++ STL中智能指针auto_ptr中定义auto_ptr_ref结构体的作用是什么

发布于 2017-02-04 07:07:59 字数 35 浏览 1014 评论 3

如题,在STL源码中看到的~定义这个结构体有什么作用呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-10-03 01:36:49

自动指针已经被c++11废弃了

自动指针 在众多魔板类 模板容器里 显得那么多余 完全不是泛型的设计思想

灵芸 2017-09-19 07:41:25

auto_ptr的拷贝构造函数、赋值操作符,它们的参数都是auto_ptr&,而不是auto_ptr const &。

一般来说,类的拷贝构造函数和赋值操作符的参数都是const &。但是auto_ptr的做法也是合理的:确保拥有权能够转移。

如果auto_ptr的拷贝构造函数和赋值操作符的参数是auto_ptr const &,那么实参的拥有权将不能转移。因为转移拥有权需要修改auto_ptr的成员变量,而实参确是一个const对象,不允许修改。

但是假设我们想写出下面的代码:

#include
#include
usingnamespace std;
int main(int argc, char **argv) {
auto_ptr<int> ptr1(auto_ptr<int>(newint(1))); //使用临时对象进行拷贝构造
auto_ptr<int> ptr2(NULL);
ptr2 = (auto_ptr<int>(newint(2))); //使用临时对象进行赋值
}

假设没有定义auto_ptr_ref类及相关的函数,那么这段代码将不能通过编译。主要的原因是,拷贝构造函数及赋值操作符的参数:auto_ptr(new int(1))和auto_ptr(new int(2))都是临时对象。临时对象属于典型的右值,而非const &是不能指向右值的(参见More Effective C++,Item 19)。auto_ptr的拷贝构造函数及赋值操作符的参数类型恰恰是auto_ptr&,明显 非const &。

auto_ptr_ref就是为了解决这个问题而设计的。

看下列代码:

auto_ptr(auto_ptr_ref __ref) throw() //element_type就是auto_ptr的模板参数。
: _M_ptr(__ref._M_ptr) { }

该版本的构造函数,可以接收auto_ptr_ref的临时对象。如果auto_ptr可以隐式转换到auto_ptr_ref,那么我们就能够用auto_ptr临时对象来调用该构造函数。这个隐式转换不难实现:

 template<typename _Tp1>
operator auto_ptr_ref<_Tp1>() throw() //隐式转换:auto_ptr到auto_ptr_ref
{ return auto_ptr_ref<_Tp1>(this->release()); }

至此,我们可以写出下面的代码,并可以通过编译:

 #include
#include
usingnamespace std;
int main(int argc, char **argv) {
auto_ptr<int> ptr1(auto_ptr<int>(newint(1))); //调用auto_ptr_ref版本的构造函数
}

同理,如果我们再提供下面的函数:

 auto_ptr&
operator=(auto_ptr_ref __ref) throw()
{
if (__ref._M_ptr != this->get())
{
delete _M_ptr;
_M_ptr = __ref._M_ptr;
}
return *this;
}

那么,下面的代码也可以通过编译:

 #include
#include
usingnamespace std;
int main(int argc, char **argv) {
auto_ptr<int> ptr2(NULL);
ptr2 = (auto_ptr<int>(newint(2))); //调用auto_ptr_ref版本的赋值操作符
}

瑾兮 2017-07-28 21:22:06

auto_ptr_ref之本质

本质上,auto_ptr_ref赋予了auto_ptr“引用”的语义,这一点可以从auto_ptr_ref的注释看出:

  /**
* A wrapper class to provide auto_ptr with reference semantics.
* For example, an auto_ptr can be assigned (or constructed from)
* the result of a function which returns an auto_ptr by value.
*
* All the auto_ptr_ref stuff should happen behind the scenes.
*/
template<typename _Tp1>
struct auto_ptr_ref
{
_Tp1* _M_ptr;

explicit
auto_ptr_ref(_Tp1* __p): _M_ptr(__p) { }
};

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文