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


10

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

注:通过比较操作,我的意思是无论是全套(<<=,...),或者太空飞船<=>


海事组织,我想知道同样的问题。operator==也失踪了。Esp。对于矢量,我经常发现直接进行比较很方便。尽管我不确定,这可能是由于静态大小跨度类型的困难所致。
darune

看起来像gsl :: span,从哪个版本的std :: span出发也不包含这些内容。
darune

1
@DanielLangr为什么不喜欢std::vectorstd::array做词典编排比较?它们已经像那些类型一样被定义了,所以为什么不在这里。
蒂莫,

2
请注意,P0122R7建议对进行比较span,但当前的标准草案不包括。
Daniel Langr

1
@darune gsl::span 确实(并且总是如此)具有比较运算符。他们只是搬到他们到他们自己的头
巴里

Answers:


3

正如Daniel Langr所指出的std::span在其初始建议P0122中有比较运算符。自工作草案N4791起,这些操作员便被撤离,其原因在P1085中说明。

简而言之,copy和const for std::span是“浅”的(意味着复制a std::span不会复制其基础元素,并且const std::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可以认为的浅表副本类似于写时复制优化。


请注意,没有什么可以阻止字符数组的所有者在std::string_view指向原始存储的同时对其进行修改。因此,std::map<std::span<T>, U>就像一样破碎std::map<std::string_view, U>。恕我直言,std::string_view也不应包含比较运算符。
Lyberta
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.