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
セマンティクスの境界を押し出すことができます。
私も行う可能性があります:発信者はより簡単だ自分T*
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>
のすべてが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'を呼び出す点はありません –