在Andrzej 的移动构造函数文章的评论中,我发布了一个被移动的对象可以调用任何没有前置条件的成员函数。我把这个例子std::vector::front
作为一个函数给出,你不能在 move-from 上调用它,std::vector
因为它具有向量不为空的先决条件。我给出了std::vector::empty
,std::vector::push_back
和std::vector::reserve
as 的示例,您可以(但不应该)在 move-from 上调用std::vector
它们,因为它们没有先决条件。
然而,这让我开始思考。std::vector::push_back
要求主机系统上有足够的连续内存可用。这与其说是对std::vector
对象的要求,不如说是关于它正在运行的系统,但在我看来,这仍然是一个先决条件。
移动构造函数使对象处于有效但未指定状态的上下文是什么,它是否适用于潜在的内存不足情况std::vector::push_back
?特别是,如果std::vector::push_back
在移动之前可以工作,它是否保证在之后工作(忽略其他进程耗尽内存等问题)?
供参考:§ 17.6.3.1
Table 20 — MoveConstructible requirements [moveconstructible]
Expression Post-condition
T u = rv; u is equivalent to the value of rv before the construction
T(rv) T(rv) is equivalent to the value of rv before the construction
rv’s state is unspecified [ Note:rv must still meet the requirements of the library compo-
nent that is using it. The operations listed in those requirements must work as specified
whether rv has been moved from or not. — end note ]