std :: spanに比較演算子がないのはなぜですか?


10

/ / プレーン配列などのstd::spanサブ領域への軽量リファレンスとして設計されていませんか?それらとの一貫性を保つために、APIに比較演算子も含めるべきではありませんか?除外の理由は何でしたか?std::vectorstd::array

注:比較演算子で、私はどちらかのフルセットを意味する(<<=、...)、または宇宙船<=>


素晴らしい質問IMO、私は同じことを考えています。operator==も欠落しています。特に ベクトルの場合、直接比較する方が便利だと思うことがよくあります。確かではありませんが、静的サイズのスパンタイプの問題が原因である可能性があります。
だるね

gsl :: spanのように見えますが、そこからstd :: spanがバージョン管理されているため、これらも含まれていません。
ダルーン

1
@DanielLangrなぜ辞書のような比較をstd::vectorstd::arrayないのですか?それらはすでにそれらの型についてそのように定義されているので、なぜここにないのですか?
Timo

2
注意P0122R7がための比較を提案しているspanが、現在のドラフト規格では、それが含まれていません。
Daniel Langr

1
@daruneにgsl::span 比較演算子があります(常にそうでした)。彼らはちょうど彼らを彼ら自身のヘッダーに
バリー

回答:


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は、通常のタイプの場合は失敗しますが、ifが失敗する場合があります。

std::string_viewコピーは浅いが比較は深いと主張する人もいるかもしれません。P1085にもこの説明があります。

これはに一致しますがstring_viewstring_viewポイントする要素を変更することはできません。したがって、の浅いコピーはstring_view、コピーオンライト最適化に似ていると考えることができます。


文字配列の所有者が元のストレージをstd::string_viewポイントしている間、それを変更することを妨げるものは何もないことに注意してください。つまり、はとstd::map<std::span<T>, U>同じくらい壊れていstd::map<std::string_view, U>ます。私見、std::string_view比較演算子も含めるべきではない。
Lyberta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.