簡體   English   中英

為什么 std::span 缺少比較運算符?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM