c++ - 移出的对象是否应该保留在 "safe"状态?

标签 c++ c++11 move-semantics

<分区>

Possible Duplicate:
How can moved objects be used?
What constitutes a valid state for a “moved from” object in C++11?

在 C++11 中实现 move 语义时,应该将移出的对象保留在安全状态,还是仅保留在“垃圾”状态?

例如在以下 C++11 包装器到原始 FILE* 资源的示例中,实现 move 构造函数的首选选项是什么?

// C++11 wrapper to raw FILE*
class File
{
  FILE* m_fp;

public:

  // Option #1
  File(File&& other)
    : m_fp(other.m_fp)
  {
    // "other" left in a "junk" state
  }

  // Option #2
  File(File&& other)
    : m_fp(other.m_fp)
  {
    // Avoid dangling reference in "other"
    other.m_fp = nullptr;
  }

  ...
};

最佳答案

必须能够对移出的对象做的唯一一件事就是销毁它。除此之外,普通类不变量是什么以及移出的对象是否费心去满足它们都取决于您的类。

例如,确保您可以分配给对象是个好主意,以防万一有人想在实例上使用 std::move 并在以后给它一个新值。 [编辑:正如在对一个建议的重复问题的回答中指出的那样,一般的 std::swap 模板从一个对象 move 然后 move 分配给它,所以如果你不这样做确保这一点然后你需要专门化 std::swap 或者你需要禁止你的类的用户使用它。]

由于您的类在其析构函数中不执行任何操作,因此任一选项都可以。选项 2 对用户来说可能更容易使用,但是如果他们在编码时假设他们不能对移出的对象做任何事情,那么它就没有区别了。但是,由于类不完整,当您编写析构函数时,这可能会改变。

关于c++ - 移出的对象是否应该保留在 "safe"状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13137786/

相关文章:

c++ - 声明 RValue 方法(例如 void opera() &&;) virtual C++1x 有意义

C++11 自动变量 : float array vs auto

c++ - 强制返回的 const 值 move 而不是复制

c++ - std::string 上的段错误

无法将 ffmpeg 中的 YUV 帧写入 .yuv 文件

c++ - 你能用 C++ 做一个计算 goto 吗?

c++ - C++14如何提高 "str1 + str2 + str3 + ..."的效率?

c++ - 引用重载,而不是唯一的按值传递+ std::move?

c++ - 如何将函数作为参数传递给transform()函数?

c++ - 为什么我可以访问我刚刚从 C++ 中的 STL vector 中删除的元素?