我怀疑我对移动语义一无所知。鉴于以下代码,我希望调试器(MSVC2010SP1)按以下顺序调用 Proxy 的成员:
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
超出范围
这对我来说毫无意义。我想要做的是跟踪代理类的生命周期,通过移动构造函数将关闭资源的工作从一个对象传递到另一个对象。