c++ - 什么是auto_ptr_ref,它实现了什么以及如何实现的

标签 c++ stl auto-ptr

auto_ptr_ref 文档 here说这个

这是一个工具类,允许进行某些转换,这些转换允许将 auto_ptr 对象传递给函数并从函数返回。

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

最佳答案

这有点令人困惑。基本上,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构造函数或 operator =auto_ptr_ref 调用争论。

如果您注意到,auto_ptr 中的转换运算符自动转换为 auto_ptr_refrelease关于来源 auto_ptr ,就像复制构造函数一样。

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

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

在 C++0x 中,auto_ptr已弃用 unique_ptr . unique_ptr甚至没有复制构造函数并使用新的“移动构造函数”,这明确说明它将修改被移动的对象并将其保留在无用(但仍然有效)状态.临时变量(又名右值)始终明确允许作为移动构造函数的参数。

C++0x 中的移动构造函数还有许多其他重大优势。它使标准 STL 容器能够存储 unique_ptr s 并做正确的事,而不是如何 auto_ptr不可能。它还基本上消除了对“交换”函数的需要,因为交换函数的全部目的通常是成为一个永远不会抛出的移动构造函数或移动赋值运算符。

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

关于c++ - 什么是auto_ptr_ref,它实现了什么以及如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2121844/

相关文章:

c++ - 将宏参数中的序列转换为单独的宏

c++ - 为什么 Microsoft Visual C++ 库实现 'unwrap' 迭代器?

c++ - 您如何组织 STL header ?

c++ - 与 auto_ptr 声明不同,unique_ptr 声明是否在其模板类型为不完整类型时是明确定义的?

c++ - 为什么在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?

c++ - 如何使用半空间测试确定一个点是在线段的前面还是后面?

c++ - 调用@plt函数时dlopen/static init上的共享库SIGSEGV

c++ - std::end(myVector) 和 myVector.end() 之间的区别

c++ - std::move 与 std::auto_ptr 相比?

c++-cli - 托管C++/CLI类中的auto_ptr或shared_ptr等效项