Czy nie zostało std::span
zaprojektowane jako lekkie odniesienie do podregionów std::vector
/ std::array
/ plain array i podobnych? Czy nie powinien zawierać operatorów porównania w interfejsie API, aby był z nimi spójny? Jakie było uzasadnienie wyłączenia?
Uwaga: przez operatorów porównania, to znaczy albo pełny zestaw ( <
, <=
...) lub statek kosmiczny<=>
operator==
brakuje również. Esp. dla wektora często uważam, że wygodne jest bezpośrednie porównywanie. Może to być spowodowane problemami z typowymi rozpiętościami wielkości, chociaż nie jestem pewien.std::vector
istd::array
zrobić? Są już tak zdefiniowane dla tych typów, więc dlaczego nie tutaj.span
, ale obecny projekt standardu go nie obejmuje.gsl::span
ma (i zawsze miał) operatory porównania. Po prostu przenieśli je do własnego nagłówkaOdpowiedzi:
Jak wskazał Daniel Langr ,
std::span
ma operatorów porównania w swojej pierwotnej propozycji P0122 . Operatory te są następnie usuwane od wersji roboczej N4791 , a przyczyny podano w P1085 .Krótko mówiąc, copy i const dla
std::span
są „płytkie” (co oznacza, że kopiowaniestd::span
nie kopiuje jego podstawowych elementów, a conststd::span
nie zapobiega modyfikacji jego podstawowych elementów), więc porównania, jeśli istnieją, powinny być również „płytkie” dla spójności.W tym dokumencie podano następujące przykłady:
Przykład 1:
Przykład 2:
Twierdzenia w tych przykładach mogą się nie powieść, jeśli
T = std::span
, podczas gdy nie dotyczy to zwykłych typów.Można argumentować, że
std::string_view
ma płytką kopię, ale głębokie porównania. P1085 ma również wyjaśnienie tego:źródło
std::string_view
wskazując je. Powiedzmy, żestd::map<std::span<T>, U>
jest tak samo zepsuty jakstd::map<std::string_view, U>
. IMHOstd::string_view
nie powinien również zawierać operatorów porównania.