C 11 中移出对象的有效性
当对象从 C 11 中移出时,其状态变得未指定,引发问题关于之后可以对其执行哪些操作。虽然标准库类型会移动到有效但未指定的状态,但自定义类型需要显式定义才能确定其移动后的有效状态。
对于 pimpl 对象,其实现隐藏在指针后面,问题出现了:一旦 Foo 对象的 pimpl 指针被移走,可以对它做什么?虽然销毁或重新分配移出的对象仍然是安全的,但尝试像 do_stuff 这样的操作将会失败,因为 pimpl 指针已变得无效。
标准设计鼓励采用保守的方法,允许启用移出的对象的未指定状态跨不同库的高效实施。这需要在对对象执行操作之前查询其状态,这项任务可能会带来性能开销,尤其是在移动操作频率较高的场景中。
为了避免此类查询,可以使用自定义类型明确指定其移出后的有效状态。例如,pimpl 类可以声明从它移动会使 do_stuff 无效并具有未定义的行为。这种方法可确保用户了解从对象移出可能产生的后果,并避免潜在的错误。
值得注意的是,移出的对象仍然必须满足标准库定义的任何概念的要求,这不考虑移出状态。因此,不维护相关概念定义的有效状态的自定义类型不能与标准库一起使用,否则会带来未定义行为的风险。
以上是在 C 11 中可以对移出的对象做什么?的详细内容。更多信息请关注PHP中文网其他相关文章!