Warum fehlen std :: span die Vergleichsoperatoren?

10

War das nicht std::spanals leichte Referenz für Unterregionen von std::vector/ std::array/ plain array und ähnlich konzipiert? Sollte es nicht auch Vergleichsoperatoren in seiner API enthalten, um mit ihnen konsistent zu sein? Was war der Grund für den Ausschluss?

Hinweis: von Vergleichsoperatoren, ich meine , entweder den vollen Satz ( <, <=, ...) oder das Raumschiff<=>

GreenScape
quelle
Gute Frage IMO, ich frage mich das gleiche. operator==fehlt auch. Esp. Für Vektoren finde ich es oft bequem, direkt zu vergleichen. Es könnte an Schwierigkeiten mit den statischen Größenbereichstypen liegen, obwohl ich nicht sicher bin.
Darune
Es sieht so aus, als ob gsl :: span, von dem std :: span versioniert ist, diese ebenfalls nicht enthält.
Darune
1
@ DanielLangr warum nicht einen lexikografischen Vergleich mögen std::vectorund std::arraytun? Sie sind für diese Typen bereits so definiert, warum also nicht hier?
Timo
2
Beachten Sie, dass P0122R7 einen Vergleich für vorschlägt span, der aktuelle Standardentwurf ihn jedoch nicht enthält.
Daniel Langr
1
@darune gsl::span hat (und hatte immer) Vergleichsoperatoren. Sie haben sie einfach in ihren eigenen Kopfball
Barry

Antworten:

3

Wie Daniel Langr betonte , std::spanhat Vergleichsoperatoren in seinem ursprünglichen Vorschlag P0122 . Diese Operatoren werden dann seit dem Arbeitsentwurf N4791 entfernt , und die Gründe sind in P1085 angegeben .

Kurz gesagt, copy und const for std::spansind "flach" (was bedeutet, dass beim Kopieren von a std::spandie zugrunde liegenden Elemente nicht kopiert werden und eine const std::spannicht verhindert, dass die zugrunde liegenden Elemente geändert werden). Daher sollten Vergleiche, falls vorhanden, auch "flach" sein. für die Konsistenz.

Dieses Papier enthält die folgenden Beispiele:

Beispiel 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

Beispiel 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

Die Aussagen in diesen Beispielen können fehlschlagen, wenn T = std::spandies nicht für reguläre Typen gilt.

Man kann argumentieren, dass std::string_viewes flache Kopien, aber tiefe Vergleiche gibt. P1085 hat auch eine Erklärung dafür:

Dies stimmt überein string_view, string_viewkann jedoch die Elemente, auf die es zeigt, nicht ändern, und daher kann die flache Kopie string_viewvon als einer Copy-on-Write-Optimierung ähnlich angesehen werden.

xskxzr
quelle
Beachten Sie, dass nichts den Eigentümer des Zeichenarrays daran hindert, den ursprünglichen Speicher zu ändern, während er std::string_viewdarauf zeigt. Also, sagen wir, std::map<std::span<T>, U>ist so kaputt wie std::map<std::string_view, U>. IMHO, std::string_viewsollte auch keine Vergleichsoperatoren enthalten.
Lyberta