std::span
不是设计为轻量级引用std::vector
/std::array
/普通数组等的子区域吗?它的API中难道不应该包含比较运算符,以与它们保持一致吗?排除这些运算符背后的原因是什么?注:这里的比较运算符指的是完整集合(
<
、<=
等)或者太空船运算符<=>
std::span
在其最初的提案P0122中具有比较运算符。然后,这些运算符在工作草案N4791中被删除,原因在P1085中说明。std::span
,复制和const是“浅层的”(意味着复制一个std::span
并不会复制其底层元素,并且const std::span
不会阻止其底层元素被修改),因此,如果存在比较,则应该也是“浅层”的以保持一致性。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
的浅复制可以被视为类似于写时复制优化。”std::string_view
指向它时修改原始存储。因此,例如 std::map<std::span<T>, U>
与 std::map<std::string_view, U>
一样有问题。在我看来,std::string_view
也不应该包含比较运算符。 - user3624760U
,这两个示例都适用于T = std::span<const U>
。难道对于这种情况,operator==
不是合理的选择吗?是否也考虑过这种方法? - m8mblespan<const T>
没有描述中的问题。 - Yakk - Adam Nevraumont==
来比较元素的值,考虑到std::span operator=
的定义和std::span
的基本意图。我不太明白为什么==
被完全移除,而不是进行浅层比较==
。这真的限制了这个类的实用性。 - undefined
std::vector
和std::array
一样进行字典比较呢?因为这些类型已经定义好了,所以为什么这里不这样做呢。 - Timospan
引入比较运算符,但是当前的草案标准并未包含它。 - Daniel Langrgsl::span
_确实_(而且一直都有)比较运算符。它们只是将它们移动到了它们自己的头文件中(https://github.com/microsoft/GSL/blob/master/include/gsl/span_ext)。 - Barry<=>
在此排除)。 - Davis Herring