移動のセマンティクスについて何か理解していないのではないかと思います。次のコードが与えられた場合、デバッガー(MSVC2010SP1)が次の順序でプロキシのメンバーを呼び出すことを期待します。
Proxy(Resource*)
で一時的なものを構築するgetProxy
Proxy(Proxy&& other)
移動構築p
~Proxy()
移動によって内臓を奪われた一時的なものの空のシェルを破壊する~Proxy() p
範囲外になりますclass Resource { void open(){} public: void close(){} Proxy && getProxy(); }; class Proxy { Resource *pResource_; Proxy(const Proxy& other); //disabled Proxy& operator=(const Proxy& other); //disabled public: Proxy(Resource *pResource):pResource_(pResource){} Proxy(Proxy&& other):pResource_(other.pResource_){other.pResource_ = nullptr;} ~Proxy() { if(pResource_) pResource_->close(); pResource_ = nullptr; } }; Proxy && Resource::getProxy() { open(); return Proxy(this); } //somewhere else, lets say in main() Resource r; { auto p = r.getProxy(); } // p goes out of scope
代わりに、順序は次のとおりです。
Proxy(Proxy*)
~Proxy()
//これはすでにclose()
予想よりも早く呼び出しますProxy(Proxy&& other)
//破壊後に移動するp.pResource_
と、nullptr
~Proxy()
//p
スコープ外になります
これは私には意味がありません。私がやろうとしているのは、あるオブジェクトから別のオブジェクトへの移動コンストラクターを介してリソースを閉じるジョブを渡すプロキシクラスの存続期間を追跡することです。