auto_ptr_ref documentation
here这样说
这是允许某些转换允许将auto_ptr对象传递给函数并从函数返回的工具类.
有人可以解释auto_ptr_ref如何帮助实现这一点.我只想了解auto_ptr类及其内部
解决方法
这很混乱基本上,auto_ptr_ref是存在的,因为auto_ptr的拷贝构造函数不是真正的标准意义上的复制构造函数.
复制构造函数通常具有如下所示的签名:
X(const X &b);
auto_ptr copy构造函数的签名如下所示:
X(X &b)
这是因为auto_ptr需要修改被复制的对象才能将其指针设置为0,以便于auto_ptr的所有权语义.
有时候,暂时不能匹配一个没有声明其参数const的构造函数.这是auto_ptr_ref所在的地方.编译器将无法调用拷贝构造函数的非const版本,但可以调用转换运算符.转换运算符创建一个auto_ptr_ref对象,这个对象只是一个指针的临时持有者.使用auto_ptr_ref参数调用auto_ptr构造函数或operator =.
如果您注意到,自动转换为auto_ptr_ref的auto_ptr中的转换运算符在源auto_ptr上发布,就像复制构造函数一样.
这是一个奇怪的小舞蹈,发生在幕后,因为auto_ptr修改被复制的东西.
关于C 0x和unique_ptr的随机相关的引文
在C 0x中,auto_ptr不赞成使用unique_ptr. unique_ptr甚至没有一个复制构造函数,并使用新的“移动构造函数”,这是一个显而易见的事实,它将修改被移动的对象并将其保留为无用(但仍然有效)状态. Temporaries(aka rvalues)明确地总是被允许作为移动构造函数的参数.
C 0x中的移动构造函数有许多其他的好处.它允许标准STL容器存储unique_ptrs并做正确的事情,而不是auto_ptrs不能.它也主要消除了对“交换”功能的需要,因为交换函数的整个目的通常是一个移动构造函数或移动赋值运算符,从不抛出.