的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'。 – juanchopanza
在基元類型(指針)上調用'std :: move'沒有意義。 –