在当前的草稿中,subj上没有任何显示。我正确吗,下面的代码
struct Omg { Omg &operator=(Omg const &o) { throw 0; } };
std::tuple t0{42, Omg{}};
std::tuple t1{10, Omg{}};
t1 = t0;
是否完全允许t1处于半分配状态?也就是说,它的第一个元素可能已经更改,而第二个元素可以保持原样,甚至变得不一致?
答案 0 :(得分:2)
是否完全允许t1处于半分配状态?
是的。 Copy-assignment被指定为:
效果:将
u
的每个元素分配给*this
的相应元素。
标准库中还有其他类型,可以执行来指定例外保证(例如optional
),但是tuple
不提供例外保证。
请注意,它没有指定分配的顺序。一个实现可以首先分配Omg
(这样就不会更改t1
),或者首先分配int
(这样就可以得到半分配状态)。
我认为实现也可以选择进行复制和交换,从而提供强大的异常保证。那将匹配指定的效果。但这不是标准所保证的。