[英]Why does std::span lack the comparison operators?
std::span
不是被設計為對std::vector
/ std::array
/ plain array等子區域的輕量級引用嗎? 它不應該在其 API 中包含比較運算符,以與它們保持一致嗎? 排除背后的原因是什么?
注意:通過比較運算符,我的意思是完整的集合 ( <
, <=
, ...) 或宇宙飛船<=>
正如 Daniel Langr 指出的那樣, std::span
在其初始提案P0122 中有比較運算符。 這些運算符從工作草案N4791起被刪除,原因在P1085中說明。
簡而言之, std::span
copy 和 const 是“淺的”(意味着復制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對此也有解釋:
這匹配
string_view
,但是string_view
不能修改它指向的元素,因此string_view
的淺拷貝可以被認為類似於寫時復制優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.