我不确定标题是否相对,因为我对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)
之间的区别是什么?我可以看到move()
不是unique_ptr
的一部分,而是我std
的一部分,所以它有更多的一般用途。
我是C++
的新手,所以最简单的方式是:
答案 0 :(得分:4)
让我详细说明问题3:什么可以移动?
正如您所指出的, std::move
不是unique_ptr
的一部分,而是std
的一部分。它能够移动任何可移动的对象,而不仅仅是指针。
在unique_ptr
的特定情况下,有一个方便的release()
允许您手动移动指针,而不使用移动运算符。但想想std::thread
或std::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));