- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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_ref
做 release
关于来源 auto_ptr
,就像复制构造函数一样。
这是一种在幕后发生的奇怪的小舞蹈,因为auto_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/
关于 auto_ptr<> 和 auto_ptr_ref<> 的内部实现,我查看了不同的来源。我有这个问题,我不知道为什么。 .... 从函数返回“auto_ptr”时,编译器发现没有合适的构造函数来
我想更好地理解创建库背后的机制和问题,我决定从 std::auto_ptr 开始。我熟悉语法和用法,但是我想了解实现细节。我已经实现了我的 auto_ptr 版本,它看起来像这样: #ifndef _
我是一名优秀的程序员,十分优秀!