10

此处的auto_ptr_ref 文档说明了 这一点

This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.

有人可以解释 auto_ptr_ref 如何帮助实现这一目标。我只想了解 auto_ptr 类及其内部结构

4

3 回答 3

15

这是相当混乱的。基本上,auto_ptr_ref存在是因为auto_ptr复制构造函数并不是标准意义上的复制构造函数。

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

X(const X &b);

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

X(X &b)

这是因为auto_ptr需要修改要从中复制的对象,以便将其指针设置为 0,以促进auto_ptr.

有时,临时对象无法匹配未声明其参数的复制构造函数const。这就是auto_ptr_ref进来的地方。编译器将无法调用复制构造函数的非常量版本,但它可以调用转换运算符。转换运算符创建一个auto_ptr_ref对象,它只是指针的临时持有者。构造auto_ptr函数 oroperator =使用auto_ptr_ref参数调用。

如果您注意到,其中的转换运算符auto_ptr会自动转换为auto_ptr_refarelease在 source 上auto_ptr,就像复制构造函数一样。

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

关于 C++0x 和 unique_ptr 的随机相关 tanget

在 C++0x 中,auto_ptr不推荐使用unique_ptr. unique_ptr甚至没有复制构造函数,而是使用新的“移动构造函数”,它明确说明它将修改要从中移动的对象并使其处于无用(但仍然有效)状态。临时变量(又名右值)总是明确允许作为移动构造函数的参数。

C++0x 中的移动构造函数还有许多其他重要的好处。它使标准 STL 容器能够存储unique_ptrs 并做正确的事情,而不是auto_ptrs 不能。它还主要消除了对“交换”函数的需要,因为交换函数的全部目的通常是作为一个从不抛出的移动构造函数或移动赋值运算符。

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

于 2010-01-23T02:53:40.917 回答
1

我刚刚找到了一个非常好的链接和这个技术的名称“移动构造函数”或“Colvin-Gibbons 技巧”

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor

于 2010-01-23T03:31:36.330 回答
0

因此,可以在auto_ptr_ref. 唯一需要的是 在插入时初始化,然后返回auto_ptr_ref来操作。auto_ptrauto_ptrauto_ptr_ref

于 2011-12-07T11:01:21.703 回答