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类及其内部结构
答案 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中,不推荐auto_ptr
使用unique_ptr
。 unique_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
进行操作。