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

时间:2010-01-23 02:36:26

标签: c++ stl auto-ptr

auto_ptr_ref文档here说明了

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类及其内部结构

3 个答案:

答案 0 :(得分:15)

相当令人困惑。基本上,auto_ptr_ref存在,因为auto_ptr复制构造函数实际上并不是标准意义上的复制构造函数。

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

X(const X &b);

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

X(X &b)

这是因为auto_ptr需要修改被复制的对象,以便将其指针设置为0,以便于auto_ptr的所有权语义。

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

如果您注意到,auto_ptr中自动转换为auto_ptr_ref的转换运算符会在源release上执行auto_ptr,就像复制构造函数一样。< / p>

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

关于C ++ 0x和unique_ptr

的随机相关tanget

在C ++ 0x中,不推荐auto_ptr使用unique_ptrunique_ptr甚至没有一个复制构造函数,并使用新的'移动构造函数',它明确表示它将修改被移动的对象并将其留在无用的状态(但仍然有效)状态。 Temporaries(aka rvalues)显然总是被允许作为移动构造函数的参数。

C ++ 0x中的移动构造函数还有许多其他好处。它使标准STL容器能够存储unique_ptr并执行正确的操作,而不是auto_ptr不能存储的方式。它也主要消除了对'swap'函数的需要,因为swap函数的整个目的通常是一个永不抛出的移动构造函数或移动赋值运算符。

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

答案 1 :(得分:2)

我刚刚发现了一个非常好的链接和这个技术的名称“Move Constructors”或“Colvin-Gibbons trick”

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

答案 2 :(得分:0)

因此,可以在auto_ptr_ref的帮助下将智能指针存储在包含器中(例如,QMap)。唯一的需求是在插入时从auto_ptr_ref初始化auto_ptr,然后从auto_ptr返回auto_ptr_ref进行操作。