War das nicht std::span
als 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<=>
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.std::vector
undstd::array
tun? Sie sind für diese Typen bereits so definiert, warum also nicht hier?span
, der aktuelle Standardentwurf ihn jedoch nicht enthält.gsl::span
hat (und hatte immer) Vergleichsoperatoren. Sie haben sie einfach in ihren eigenen KopfballAntworten:
Wie Daniel Langr betonte ,
std::span
hat 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::span
sind "flach" (was bedeutet, dass beim Kopieren von astd::span
die zugrunde liegenden Elemente nicht kopiert werden und eine conststd::span
nicht 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:
Beispiel 2:
Die Aussagen in diesen Beispielen können fehlschlagen, wenn
T = std::span
dies nicht für reguläre Typen gilt.Man kann argumentieren, dass
std::string_view
es flache Kopien, aber tiefe Vergleiche gibt. P1085 hat auch eine Erklärung dafür:quelle
std::string_view
darauf zeigt. Also, sagen wir,std::map<std::span<T>, U>
ist so kaputt wiestd::map<std::string_view, U>
. IMHO,std::string_view
sollte auch keine Vergleichsoperatoren enthalten.