移动物体怎么办?

fre*_*low 136 c++ swap variable-assignment move-semantics c++11

标准是否准确定义了对象移动后我可以对其做什么?我曾经认为你用移动物体做的所有事情都可以破坏它,但这还不够.

例如,采用swap标准库中定义的函数模板:

template <typename T>
void swap(T& a, T& b)
{
    T c = std::move(a); // line 1
    a = std::move(b);   // line 2: assignment to moved-from object!
    b = std::move(c);   // line 3: assignment to moved-from object!
}
Run Code Online (Sandbox Code Playgroud)

显然,必须可以分配给移动的对象,否则第2行和第3行将失败.那么移动对象我还能做些什么呢?我在哪里可以找到标准中的这些细节?

(顺便说一句,为什么它T c = std::move(a);不是T c(std::move(a));第1行呢?)

How*_*ant 109

17.6.5.15 [lib.types.movedfrom]

可以从(12.8)移动C++标准库中定义的类型的对象.可以显式指定或隐式生成移动操作.除非另有规定,否则此类移动物体应置于有效但未指定的状态.

当对象处于未指定状态时,您可以对没有前提条件的对象执行任何操作.如果存在您希望执行前提条件的操作,则无法直接执行该操作,因为您不知道对象的未指定状态是否满足前提条件.

通常没有先决条件的操作示例:

  • 毁坏
  • 分配
  • 常量观察员如get,empty,size

通常具有前提条件的操作示例:

  • 提领
  • pop_back

此答案现在以视频格式显示在此处:http://www.youtube.com/watch?v = vLinb2fgkHk&t = 47m10s

  • @FredOverflow当然,只要这些检查本身没有先决条件. (6认同)
  • @ 6502:你没有意义.C++ 03类不是"违反C++ 0x标准",因为移动ctor _if generated_会违反标准.并且C++ 03代码不会移动那个类,因此没有理由生成移动ctor. (3认同)
  • @Chris:但这与正常的、未移动的对象有什么不同? (2认同)
  • @FredOverflow:唯一的区别是大多数操作将对象保留在指定状态。移出状态未指定,但除此之外并不特殊。当然,如果您是班级的作者,您可以根据需要自由地使您的移出状态变得特别。但要知道,如果您在 std 算法中使用您的类,则您的类型需要满足 std 算法的规定要求,无论是否处于移出状态([utility.arg.requirements],表 20 和 22)。 (2认同)
  • 也许,是应该是一个单独的问题,但这是否意味着:如果我有'的char*缓冲区的字符串;`和`INT长度;`成员,那么我的移动构造函数/转让必须交换(或一组),两者的价值?或者,这将是确定,如果长度未指定的(意味着`empty`和`size`返回无意义的值)? (2认同)

Pup*_*ppy 52

已移动的对象存在于未指定但有效的状态中.这表明,虽然对象可能不再能够做很多事情,但它的所有成员函数仍然应该表现出定义的行为 - 包括operator=- 并且所有成员都处于已定义的状态 - 并且它仍然需要销毁.标准没有给出具体的定义,因为它对每个UDT都是唯一的,但您可能能够找到标准类型的规范.有些像容器是相对明显的 - 它们只是移动它们的内容而空容器是一个明确定义的有效状态.基元不会修改移动的对象.

旁注:我相信T c = std::move(a)如果移动构造函数(或复制构造函数,如果没有提供移动)是显式的,则函数将失败.

  • 不是*所有*成员函数都会表现出定义的行为.只有那些没有先决条件的人.例如,你可能不希望`pop_back`从'vector`移动.但是你当然可以找出它是否为"空()". (25认同)
  • 我们正在讨论移动对象.不是已知处于空状态的对象.移动的对象具有未指定的状态(除非当然另有指定).[lib.types.movedfrom] (11认同)
  • @Howard Hinnant:来自空`vector`的`pop_back`无论如何都有来自内存的未定义行为,所以我很确定来自显示未定义行为的移动向量的`pop_back`是一致的. (5认同)
  • @Howard未指定但有效,所以`pop_back`仍然表现得像任何有效的向量(甚至可能是一个空向量). (5认同)