什么构成C ++ 11中“移动”对象的有效状态?
我一直在试图解决C ++ 11中的移动语义应该如何工作,而且我很难理解移动对象需要满足的条件。看看这里的答案并没有真正解决我的问题,因为无法看到如何以合理的方式将它应用于pimpl对象,尽管移动语义的参数非常适合pimpls。
我的问题最简单的说明涉及pimpl习语,如下所示:
class Foo { std::unique_ptr<FooImpl> impl_;public: // Inlining FooImpl's constructors for brevity's sake; otherwise it // defeats the point. Foo() : impl_(new FooImpl()) {} Foo(const Foo & rhs) : impl_(new FooImpl(*rhs.impl_)) {} Foo(Foo && rhs) : impl_(std::move(rhs.impl_)) {} Foo & operator=(Foo rhs) { std::swap(impl_, rhs.impl_); return *this; } void do_stuff () { impl_->do_stuff; }};
现在,一旦我离开了,我该怎么办Foo
?我可以安全地销毁移动的物体,我可以分配给它,这两者都绝对是至关重要的。但是,如果我尝试do_stuff
使用我的Foo
,它会爆炸。在我为我的定义添加移动语义之前Foo
,每个人都Foo
满足了它的不变性do_stuff
,而现在已不再是这样了。似乎没有很多很好的替代方案,因为(例如)将移动放入Foo
将涉及新的动态分配,这部分地违背了移动语义的目的。我可以检查是否impl_
输入do_stuff
并将其初始化为默认值FooImpl
如果是,但是这会增加(通常是假的)检查,如果我有很多方法,那就意味着要记住每一个检查。
我应该放弃能够do_stuff
成为合理的不变量的想法吗?
绝地无双
相关分类