gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:48:07 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com