move() 和 unique_ptr 是不可替代的吗?

Is move() with unique_ptr irreplaceable?

我不确定标题是否是相对的,因为我对 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 将从 q 手中夺取 A 所有权,而不会破坏 [=18] =].

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

我可以看到 move() 不是 unique_ptr 的一部分,相反,在我看来它是 std 的一部分,因此它有更广泛的用途。

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

  1. 移动可以做什么?它的用途是什么?
  1. 是的,没错。
  2. 在你的情况下,没有明显的区别。

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

正如您所指出的,

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

unique_ptr 的特殊情况下,release() 允许您手动移动指针,而无需使用移动运算符。但是想想 std::threadstd::fstream 的例子,那里没有 release/reacquire 运算符。

请注意 std::move 本身没有任何作用。有人认为returns临时的同时破坏了原来的,所以单:

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

会将q移至虚无并摧毁物体...

这不是真的。 std::move() 所做的只是转换为右值引用。它实际上是移动赋值运算符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));