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<=>


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.