move
是多余的。
我会这样做:
void takeOwnership(std::unique_ptr<MyObject> nowItsReallyMyObject)
{
myObjects.emplace_back(std::move(nowItsReallyMyObject));
}
因为我希望尽可能将unique_ptr的所有权语义“向外”移动。我可能会编写此实用程序函数:
template<class T>
std::unique_ptr<T> wrap_in_unique( T* t ) {
return std::unique_ptr<T>(t);
}
让呼叫者可以:
foo.takeOwnership(wrap_in_unique(some_ptr));
甚至更好的是,他们可以尽可能地推动unique_ptr
语义的边界。
我甚至可能会这样做:
template<class T>
std::unique_ptr<T> wrap_in_unique( T*&& t ) {
auto* tmp = t;
t = 0;
return std::unique_ptr<T>(tmp);
}
template<class T>
std::unique_ptr<T> wrap_in_unique( std::unique_ptr<T> t ) {
return std::move(t);
}
这个功能可以更轻松地将调用者的 T*
转换为 unique_ptr
。他们所有的 T*
->unique_ptr<T>
现在都被包装在一个 std::move
中,并将源指针置零。
因此,如果他们有
struct I_am_legacy {
T* I_own_this = 0;
void GiveMyStuffTo( SomeClass& sc ) {
sc.takeOwnership( wrap_in_unique(std::move(I_own_this)) );
}
};
代码可以转换为:
struct I_am_legacy {
std::unique_ptr<T> I_own_this;
void GiveMyStuffTo( SomeClass& sc ) {
sc.takeOwnership( wrap_in_unique(std::move(I_own_this)) );
}
};
它仍然编译并且工作方式相同。(与I_own_this
的其他交互可能需要更改,但其中一部分已经是unique_ptr兼容的)。
std::move
。 - juanchopanzastd::move
没有意义。 - M.M