C 11 中移出对象的有效性
理解 C 11 中移出对象的有效性可能很复杂。本文旨在阐明这个概念,特别是在 pimpl 对象的上下文中。
移自对象
当对象被移出时,其状态将变得不确定。标准库定义了标准库类型的有效性标准,确保移出的对象处于有效但未指定的状态。但是,对于自定义类型,开发人员有责任定义和记录移出对象的有效状态和允许的操作。
示例:Pimpl Idiom
In示例 pimpl 习惯用法中,impl_ 成员指向动态分配。移动操作后,移出对象中的指针将设置为 nullptr。这使得 do_stuff() 方法无效,因为它尝试取消引用 impl_ 指针。
不变与有效状态
Foo 对象始终可以 do_stuff 的不变() 移出后不再有效。一般来说,移出的对象可能无法满足适用于未移动对象的所有不变量。
选项 1:检查操作
一个选项是显式检查如果 do_stuff() 中的 impl_ 指针为 nullptr,并在必要时对其进行初始化。但是,这会带来潜在的性能开销。
选项 2:定义无效状态
或者,代码可以显式定义移出的 Foo 对象处于无效状态状态并且对它们调用 do_stuff() 将导致错误。
概念和移出对象
需要注意的是,标准库定义的概念不考虑移出对象。为了满足概念的要求,自定义类型的移出对象仍然必须满足概念要求。
结论
理解移出对象的有效性至关重要用于正确实现移动语义。开发人员应仔细考虑移动操作对其对象状态的影响,并相应地定义预期行为。
以上是C 11 中移出对象的有效性和允许的操作是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!