14

不是设计为对//普通数组std::span子区域的轻量级引用吗?它不应该在其 API 中包含比较运算符,以与它们保持一致吗?排除的原因是什么?std::vectorstd::array

注意:通过比较运算符,我的意思是完整的集合 ( <, <=, ...) 或宇宙飞船<=>

4

1 回答 1

3

正如 Daniel Langr 指出的std::span在其最初的提案P0122中有比较运算符。这些算子自工作草案N4791起被删除,原因在P1085中说明。

简而言之,copy 和 const forstd::span是“浅层的”(意味着复制 astd::span不会复制其底层元素,并且 conststd::span不会阻止其底层元素被修改),因此比较(如果存在)也应该是“浅层的”为了一致性。

该论文给出了以下示例:

示例 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

示例 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

如果 ,这些示例中的断言可能会失败T = std::span,而对于常规类型则不会。

有人可能会争辩说,它std::string_view有浅拷贝但有深度比较。P1085 对此也有解释:

这 match string_view,但是string_view不能修改它指向的元素,因此string_view可以认为浅拷贝类似于写时复制优化。

于 2020-03-11T11:41:23.950 回答