std::元组分配和复制/移动异常保证

std::tuple assignment and copy/move exception guarantees

本文关键字:移动 异常 复制 元组 分配 std      更新时间:2023-10-16

我在当前草稿中没有看到任何关于 subj 的内容。我做对了吗,以下代码

struct Omg { Omg &operator=(Omg const &o) { throw 0; } };
std::tuple t0{42, Omg{}};
std::tuple t1{10, Omg{}};
t1 = t0;

是否完全允许将 T1 保留为半分配状态? 也就是说,它的第一个元素可能已经改变了,但第二个元素可以保持原样,甚至变得不一致?

是否完全允许将 T1 保留为半分配状态?

是的。复制分配仅指定为:

效果:u的每个元素分配给*this的相应元素。

标准库中还有其他类型确实指定了异常保证(例如optional(,但tuple没有提供。

请注意,它不指定分配的顺序。实现可以首先分配Omg(因此不会更改t1(或首先分配int(因此最终会得到半分配状态(。

我认为实现也可以选择进行复制和交换,从而提供强大的异常保证。这将匹配指定的效果。但这并不能由标准保证。