理解 C 11 中移出对象的有效状态
C 11 中的移动语义引入了一个关键概念:之后对象的状态被搬离。然而,移出对象必须满足的确切条件可能会令人困惑。
pimpl 对象的问题
考虑 pimpl 习惯用法,其中一个类包装一个指向实现对象的指针。如果我们从 Foo 对象(包含 std::unique_ptr
标准库移出状态
C 标准定义标准库类型的移出对象放置在“未指定但有效”的状态中。状态。”这意味着您可以对具有有效前提条件的它们执行操作。
但是,对于非标准类型,您必须定义并记录移出后允许的有效状态和操作。
定义 pimpl 的有效状态
在 Foo 示例中,我们可以指定从它移动会渲染do_stuff 函数无效。这将防止我们意外地在移出的对象上调用它。
避免动态分配
为了避免在检查有效状态时动态分配的开销,请考虑使用“空对象”模式。这涉及到当对象处于无效状态时使用默认的 FooImpl。
概念和移出对象
最后,请注意移出对象仍必须满足标准库概念的要求。如果您的类型未保持有效状态,则将其与标准库函数一起使用可能会导致未定义的行为。
以上是C 11 中移出对象的有效状态是什么以及如何定义它们?的详细内容。更多信息请关注PHP中文网其他相关文章!