C++ 什么是auto_ptr_ref,它实现了什么以及如何实现

C++ 什么是auto_ptr_ref,它实现了什么以及如何实现,c++,stl,auto-ptr,C++,Stl,Auto Ptr,auto_ptr_ref文档中说 这是一个工具类,允许某些转换,允许自动ptr对象传递到函数或从函数返回。 有人能解释一下auto_ptr_ref是如何帮助实现这一点的吗。我只是想了解auto_ptr类及其内部结构,它相当混乱。基本上,auto_ptr_ref之所以存在,是因为auto_ptrcopy构造函数并不是标准意义上的复制构造函数 复制构造函数的签名通常如下所示: X(const X &b); X(X &b) auto_ptrcopy构造函数的签名如下所示: X(co

auto_ptr_ref文档中说

这是一个工具类,允许某些转换,允许自动ptr对象传递到函数或从函数返回。


有人能解释一下auto_ptr_ref是如何帮助实现这一点的吗。我只是想了解auto_ptr类及其内部结构,它相当混乱。基本上,
auto_ptr_ref
之所以存在,是因为
auto_ptr
copy构造函数并不是标准意义上的复制构造函数

复制构造函数的签名通常如下所示:

X(const X &b);
X(X &b)
auto_ptr
copy构造函数的签名如下所示:

X(const X &b);
X(X &b)
这是因为
auto_ptr
需要修改要从中复制的对象,以便将其指针设置为0,以便于
auto_ptr
的所有权语义

有时,临时变量无法匹配未声明其参数
const
的复制构造函数。这就是
auto_ptr_ref
的作用。编译器将无法调用复制构造函数的非常量版本,但它可以调用转换运算符。转换操作符创建一个
auto_ptr_ref
对象,它只是指针的一个临时保持器。使用
auto\u ptr\u ref
参数调用
auto\u ptr
构造函数或
operator=

如果您注意到,
auto_ptr
中自动转换为
auto_ptr\u ref
的转换运算符在源
auto_ptr
上执行
释放
,就像复制构造函数一样

这是一种发生在幕后的奇怪的小舞蹈,因为
auto_ptr
修改了被复制的东西

关于C++0x和唯一\u ptr的随机相关tanget 在C++0x中,
auto\u ptr
被弃用,取而代之的是
unique\u ptr
unique\u ptr
甚至没有副本构造函数,并且使用了新的“move构造函数”,它明确说明了这样一个事实,即它将修改要从中移动的对象,并使其处于无用(但仍然有效)状态。临时变量(又称右值)始终被明确允许作为移动构造函数的参数

C++0x中的move构造函数还有许多其他好处。它使标准STL容器能够存储
unique\u ptr
s并执行正确的操作,而不是
auto\u ptr
s无法执行的操作。它还基本上消除了对“swap”函数的需要,因为swap函数的整个目的通常是作为一个从不抛出的移动构造函数或移动赋值操作符


这是另一个期望。移动构造函数和移动赋值操作符(很像析构函数)是不应该抛出的。

我刚刚找到了一个很好的链接,并为这种技术命名为“移动构造函数”或“科尔文-吉本斯技巧”


因此,在
自动\u ptr\u ref
的帮助下,可以将智能指针存储在容器中(例如,QMap)。插入时只需从
auto\u ptr
初始化
auto\u ptr\u ref
,然后从
auto\u ptr\u ref
返回
auto\u ptr\u ref
进行操作。

并没有消除交换的需要,但确实取代了移动时交换的使用。@Roger Pate,哦,是的,你说得对。例如,理想情况下,您可以复制一个向量,尝试在副本中添加一些内容,然后将原始内容替换为副本。虽然在大多数情况下,您可以使用移动分配轻松地将副本移动到原始副本中。@罗杰:也许我理解错误,但它确实消除了对自定义
交换
功能的需要。它用编写右值函数的要求来代替它,我们无论如何都会这样做(而且看起来它们可以被默认),所以我要说的是我们真的被保存了一个函数。)无耻的自我插入:@GMan:也许我误解了,但它没有说自定义交换函数,我把它解释为“任何时候你想使用交换”(而不是实现),例如对于sort之类的算法。@Roger Pate,我说的是自定义交换函数。我同意你的看法,但没有仔细考虑。一旦你有了一个move构造函数,就有可能实现一个有效的通用交换操作。