c++ - 移动构造函数的后置条件是什么?

标签 c++ c++11 language-lawyer

考虑一个类:

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/

相关文章:

c++ - 尝试打开文件并使用 vector 逐字复制

c++ - 什么时候允许推导 initializer_list?

c++ - 显式特化已删除的主模板

c++ - 为什么 move 构造函数既没有用clang声明也没有删除?

C++11 正则表达式匹配——我无法让它正常工作

c++11 - 避免 std::shuffle 中的自分配

c++ - 指向 volatile 的指针的迭代器特征

c - long long 是 C 中的一种类型吗?

c++ - std::function 无法区分重载函数

c++ - 打破游戏中 GameFlow 和 Controller 之间循环依赖的最佳方法是什么?