提问人:fredoverflow 提问时间:8/11/2011 更新时间:10/25/2016 访问量:26172
我可以对从中移动的对象执行哪些操作?
What can I do with a moved-from object?
问:
该标准是否精确地定义了对象被移出后我可以对它做什么?我曾经认为,对于一个从中移动的对象,你所能做的就是破坏它,但这还不够。
例如,采用标准库中定义的函数模板: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!
}
显然,必须能够分配给从中移动的对象,否则第 2 行和第 3 行将失败。那么,我还能对从中移动的对象做什么呢?我究竟在哪里可以找到标准中的这些详细信息?
(顺便说一句,为什么它不是在第 1 行?T c = std::move(a);
T c(std::move(a));
答:
移出对象以未指定但有效的状态存在。这表明,虽然该对象可能不再能够做很多事情,但它的所有成员功能仍然应该表现出定义的行为 - 包括——并且它的所有成员都处于定义的状态 - 并且它仍然需要破坏。该标准没有给出具体定义,因为它对于每个 UDT 都是唯一的,但您可以找到标准类型的规范。一些类似的容器相对明显——它们只是移动它们的内容,而空容器是一个明确定义的有效状态。基元不会修改从中移动的对象。operator=
旁注:我相信是这样,如果移动构造函数(或复制构造函数,如果没有提供移动)是显式的,则该函数将失败。T c = std::move(a)
评论
pop_back
vector
empty()
pop_back
vector
pop_back
pop_back
17.6.5.15 [lib.types.movedfrom]
C++ 标准库中定义的类型的对象可以从 (12.8). 移动操作可以显式指定,也可以隐式指定 生成。除非另有规定,否则此类移出的物体应 处于有效但未指定的状态。
当对象处于未指定状态时,可以对对象执行任何没有前提条件的操作。如果存在要执行的具有前置条件的操作,则不能直接执行该操作,因为您不知道对象的未指定状态是否满足前置条件。
通常没有前提条件的操作示例:
- 破坏
- 分配
- 常量观察者,例如 , ,
get
empty
size
通常具有前提条件的操作示例:
- 引用
- pop_back
这个答案现在以视频格式出现在这里:http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
评论
char* buffer;
int length;
empty
size
上一个:插入地图的首选/惯用方式是什么?
下一个:在 Kotlin 中测试预期异常
评论