不是设计为对//普通数组等std::span
子区域的轻量级引用吗?它不应该在其 API 中包含比较运算符,以与它们保持一致吗?排除的原因是什么?std::vector
std::array
注意:通过比较运算符,我的意思是完整的集合 ( <
, <=
, ...) 或宇宙飞船<=>
正如 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
可以认为浅拷贝类似于写时复制优化。