1

我正在乱扔移动构造函数和赋值运算符。

一个众所周知的问题std::vector是向量元素必须在重新分配时被复制,并且如果所述元素的移动构造函数不是,则不能移动noexcept。这是为了保持向量的强异常安全保证(如果移动一个元素抛出并且我们正在移动整个向量的中间,我们会留下一半的移动元素向量,所以最好复制所以我们如果操作失败,至少可以回滚)。

但是,我不知道的是,它也std::tuple遇到了这个问题。给定 a std::tuple<A, B, A>,其中 B 的移动赋值运算符抛出,移动所述元组导致只有第一个A对象被移动到新元组中,而后两个保留在旧元组中。我们基本上将对象分成两半。我刚刚测试了这个确切的场景,果然,元组现在处于不一致的状态。

struct然后我用同样的三个成员尝试了同样的事情, AB然后A再一次。我惊恐地发现它有完全相同的问题。默认的移动赋值运算符不考虑异常安全。

这实际上是预期的行为吗?不std::tuple提供强大的异常安全保障?默认移动赋值运算符是否不提供上述保证?

这似乎是一个巨大的问题。对于成员移动可能抛出的情况,我们是否必须显式提供移动构造函数和移动赋值运算符?这本质上意味着始终在通用/模板上下文中提供它。这是很多工作。我们对于它可以做些什么呢?

4

0 回答 0