【问题标题】:std::tuple assignment and copy/move exception guaranteesstd::tuple 赋值和复制/移动异常保证
【发布时间】:2018-09-29 14:21:47
【问题描述】:

我在当前草稿中没有看到关于 subj 的任何内容。我没听错吧,下面的代码

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

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

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

【问题讨论】:

  • 每个抛出的重载赋值运算符不都是这种情况吗?
  • @PlinyTheElder No.

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


【解决方案1】:

是否完全允许将 t1 留在半分配状态?

是的。 Copy-assignment 仅指定为:

效果:u的每个元素赋值给*this的对应元素。

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

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

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

【讨论】:

  • 复制和交换不会对这种情况起任何作用,除非类型不可交换。
  • 我不认为复制和交换是合法的。 Exept 也许好像。
猜你喜欢
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多