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)
有什么区别?
我可以看到 move()
不是 unique_ptr
的一部分,相反,在我看来它是 std
的一部分,因此它有更广泛的用途。
我是 C++
的新手,所以以最简单的方式:
- 移动可以做什么?它的用途是什么?
- 是的,没错。
- 在你的情况下,没有明显的区别。
我来详细说明问题3:move能做什么?
正如您所指出的,std::move
不是 unique_ptr
的一部分,而是 std
的一部分。它能够移动任何可移动对象,而不仅仅是指针。
在 unique_ptr
的特殊情况下,release()
允许您手动移动指针,而无需使用移动运算符。但是想想 std::thread
或 std::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));
我不确定标题是否是相对的,因为我对 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)
有什么区别?
我可以看到 move()
不是 unique_ptr
的一部分,相反,在我看来它是 std
的一部分,因此它有更广泛的用途。
我是 C++
的新手,所以以最简单的方式:
- 移动可以做什么?它的用途是什么?
- 是的,没错。
- 在你的情况下,没有明显的区别。
我来详细说明问题3:move能做什么?
正如您所指出的,std::move
不是 unique_ptr
的一部分,而是 std
的一部分。它能够移动任何可移动对象,而不仅仅是指针。
在 unique_ptr
的特殊情况下,release()
允许您手动移动指针,而无需使用移动运算符。但是想想 std::thread
或 std::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));