【问题标题】:what is auto_ptr_ref, what it achieves and how it achieves it什么是 auto_ptr_ref,它实现了什么以及它是如何实现的
【发布时间】:2010-01-23 02:36:25
【问题描述】:

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 类及其内部结构

【问题讨论】:

    标签: c++ stl auto-ptr


    【解决方案1】:

    这是相当混乱的。基本上,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_ref 参数调用 auto_ptr 构造函数或 operator =

    如果您注意到,auto_ptr 中自动转换为 auto_ptr_ref 的转换运算符在源 auto_ptr 上执行 release,就像复制构造函数一样。

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

    关于 C++0x 和 unique_ptr 的随机相关文档

    在 C++0x 中,auto_ptr 已弃用,取而代之的是 unique_ptrunique_ptr 甚至没有拥有复制构造函数,而是使用了新的“移动构造函数”,它明确表示它将修改被移动的对象并使其无用(但仍然有效)状态。临时变量(又名右值)总是明确允许作为移动构造函数的参数。

    C++0x 中的移动构造函数还有许多其他重要的好处。它使标准 STL 容器能够存储 unique_ptrs 并做正确的事情,而 auto_ptrs 则不能。它还主要消除了对“交换”函数的需要,因为交换函数的全部目的通常是作为一个永远不会抛出的移动构造函数或移动赋值运算符。

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

    【讨论】:

    • 并没有消除交换的需要,但确实取代了移动交换的使用。
    • @Roger Pate,哦,是的,你是对的。例如,理想情况下,您会复制一个矢量,尝试在副本中添加一些内容,然后将原件换成副本。尽管在大多数情况下,您可以使用移动分配轻松地将副本移动到原件中。
    • @Roger:也许我理解错了,但它确实消除了对自定义 swap 函数的需求。它将它替换为编写我们无论如何都会做的右值函数的要求(并且看起来它们可以被默认),所以我想说我们真的被保存了一个函数。)无耻的自我插入:stackoverflow.com/questions/2078515/…
    • @GMan:也许我理解错了,但它没有说自定义交换功能,我将其解释为“任何时候你想使用交换”(而不是实现),比如至于排序之类的算法。
    • @Roger Pate,我说的是自定义交换函数。我没有仔细考虑就同意了。一旦有了移动构造函数,就可以实现高效的通用交换操作。
    【解决方案2】:

    我刚刚找到了一个非常好的链接,并为这种技术命名为“移动构造函数”或“Colvin-Gibbons 技巧”

    http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor

    【讨论】:

      【解决方案3】:

      因此,可以在 auto_ptr_ref 的帮助下将智能指针存储在容器(例如 QMap)中。只需在插入时从auto_ptr初始化auto_ptr_ref,从auto_ptr_ref返回auto_ptr即可操作。

      【讨论】:

        猜你喜欢
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多