move_(with unique_ptr是不可替代的吗?

时间:2018-04-21 19:36:44

标签: c++ c++11 move unique-ptr

我不确定标题是否相对,因为我对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)之间的区别是什么?
  3. 我可以看到move()不是unique_ptr的一部分,而是我std的一部分,所以它有更多的一般用途。

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

    1. 什么可以移动呢?有什么用途?

1 个答案:

答案 0 :(得分:4)

  1. 是的,这是对的。
  2. 在你的情况下,没有明显的区别。
  3. 让我详细说明问题3:什么可以移动?

    正如您所指出的,

    std::move不是unique_ptr的一部分,而是std的一部分。它能够移动任何可移动的对象,而不仅仅是指针。

    unique_ptr的特定情况下,有一个方便的release()允许您手动移动指针,而不使用移动运算符。但想想std::threadstd::fstream的例子,那里没有发布/重新获取运算符。

    请注意,std::move本身不执行任何操作。有些人认为它会在破坏原始的同时返回一个临时的,所以单一:

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

    q移至虚无并摧毁对象......

    事实并非如此。 std::move()所做的全部是对rvalue-reference的强制转换。它实际上是移动赋值运算符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));