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

时间:2018-09-29 14:21:48

标签: c++ language-lawyer c++17

在当前的草稿中,subj上没有任何显示。我正确吗,下面的代码

struct Omg { Omg &operator=(Omg const &o) { throw 0; } };

std::tuple t0{42, Omg{}};
std::tuple t1{10, Omg{}};
t1 = t0;

是否完全允许t1处于半分配状态?也就是说,它的第一个元素可能已经更改,而第二个元素可以保持原样,甚至变得不一致?

1 个答案:

答案 0 :(得分:2)

  

是否完全允许t1处于半分配状态?

是的。 Copy-assignment被指定为:

  

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

标准库中还有其他类型,可以执行来指定例外保证(例如optional),但是tuple不提供例外保证。

请注意,它没有指定分配的顺序。一个实现可以首先分配Omg(这样就不会更改t1),或者首先分配int(这样就可以得到半分配状态)。

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