代码之家  ›  专栏  ›  技术社区  ›  Hasan Zeen

具有unique\u ptr的move()是否不可替代?

  •  3
  • Hasan Zeen  · 技术社区  · 6 年前

    我不确定这个标题是否是相对的,因为我对这个问题没有足够的了解 move() .正因为这个原因,很难搜索并成功找到我问题的答案。

    考虑以下代码:

    using namespace std;
    
    struct A
    {
        A(){cout << "Created!\n";}
        ~A(){cout << "Destroyed!\n";};
    };
    
    void f()
    {
        unique_ptr<A> q(new A);
    
        unique_ptr<A> t (q.release());  // ----> (1)
        // unique_ptr<A> t = move(q);   // ----> (2) 
    }
    
    int main() { f(); }
    

    我的理解是:在这两种情况下 (1) (2) 这个 t 将接受 A 所有权自 q 不破坏 object A

    1. 这是正确的吗?
    2. 两者的区别是什么 (1) (2) ?

    我看得出来 移动() 不属于 unique_ptr 相反,在我看来 std 所以它有更广泛的用途。

    我是新手 C++ 因此,以最简单的方式:

    1. move能做什么?它有什么用途?
    1 回复  |  直到 6 年前
        1
  •  4
  •   Ben Voigt Caesar    6 年前
    1. 是的,这是正确的。
    2. 在你的情况下,没有明显的区别。

    让我详细说明问题3: move能做什么?

    std::move 如您所述,不属于 unique_ptr 但是 std 。它可以移动任何可移动的对象,而不仅仅是指针。

    在特定情况下 唯一\u ptr 那就是handy release() 这允许您手动移动指针,而无需使用移动操作符。但想想例如 std::thread std::fstream ,那里没有释放/重新获取操作员。

    请注意 std::移动 它本身不起任何作用。有人认为它在破坏原有的同时返回一个临时的,所以一个单一的:

    std::unique_ptr<A> q(new A);
    std::move(q); //this does nothing!!!
    

    将移动 q 走向虚无,摧毁目标。。。

    这不是真的。所有这些 std::move() does是对右值引用的强制转换。实际上 移动分配运算符 ( operator=(T&&) )或者 移动构造函数 ( T(T&&) )这才是真正的感动。

    你也可以说:

    std::unique_ptr<A> q(new A);
    std::unique_ptr<A> r(static_cast<std::unique_ptr<A>&&>(q));
    

    但这很麻烦。 std::move() 更好看的是:

    std::unique_ptr<A> q(new A);
    std::unique_ptr<A> r(std::move(q));