考虑一个类:
class foo {
public:
foo(foo &&rhs) { /* some code */ }
~foo() noexcept { /* code that does destruction of owning objects */ }
private:
/* some non-trivial pointer graph like structure */
};
假设:
{
foo &f = get_from_other_class();
foo g = std::move(f);
// some time later f goes our of scope or the owning object is destroyed.
}
std::move(f)
执行后,什么后置条件适用于 f
?
注意事项
我怀疑 f
必须仍然是完全可破坏的(不会破坏 g
的拥有内容)但我没有在 中找到相应的引用C++11 标准。我正在浏览 12.8 复制和移动类对象。
最佳答案
每个对象都必须是可破坏的,除非你只动态分配它。在被“移出”之后,即将其值绑定(bind)到右值引用(例如移动构造函数的第一个参数)后,对象仍然需要有效且可破坏,但通常它可以处于“未指定”状态状态,您根本不应该再查看该对象,或者让它超出范围或重新分配它。
某些类型提供更强的保证,例如 std::unique_ptr
promise 在移动构造时,它会将移动的对象留在等于 nullptr
的状态。
右值和右值引用背后的一般思想是右值对象不应该有别名,具体来说,当对象绑定(bind)到右值引用时,对象没有其他别名。标准库对其公开的右值引用接口(interface)做出这些假设。
关于c++ - 移动构造函数的后置条件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26579132/