为什么std::span缺少比较运算符



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

注意:通过比较运算符,我指的是全集(<<=,…(或宇宙飞船<=>

正如Daniel Langr所指出的,std::span在其最初的提案P0122中有比较运算符。这些操作人员随后从工作草案N4791中删除,原因在P1085中说明。

简而言之,std::span的copy和const是"浅"的(意味着复制std::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对此也有一个解释:

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

最新更新