¿No fue std::spandiseñado como una referencia ligera para subregiones de std::vector/ std::array/ matriz simple y similares? ¿No debería contener también operadores de comparación en su API, para ser coherentes con ellos? ¿Cuál fue el razonamiento detrás de la exclusión?
Nota: los operadores de comparación, es decir, ya sea el conjunto completo ( <, <=, ...) o de la nave espacial<=>

operator==También falta. Esp. para el vector, a menudo me parece conveniente comparar directamente. Podría deberse a dificultades, tal vez con los tipos de tramo de tamaño estático, aunque no estoy seguro.std::vectorystd::arrayhacer? Ya se definen así para esos tipos, entonces, ¿por qué no aquí?span, pero el borrador del estándar actual no lo incluye.gsl::spantiene (y siempre tuvo) operadores de comparación. Simplemente los movieron a su propio encabezadoRespuestas:
Como señaló Daniel Langr ,
std::spantiene operadores de comparación en su propuesta inicial P0122 . Estos operadores se eliminan luego del borrador de trabajo N4791 , y las razones se exponen en P1085 .En resumen, copy y const for
std::spanson "superficiales" (lo que significa que copiar unstd::spanno copia sus elementos subyacentes, y un conststd::spanno evita que se modifiquen sus elementos subyacentes), por lo que las comparaciones, si existen, también deberían ser "superficiales" por consistencia.Ese documento da los siguientes ejemplos:
Ejemplo 1:
Ejemplo 2
Las afirmaciones en estos ejemplos pueden fallar si
T = std::span, mientras que no lo hace para los tipos regulares.Se puede argumentar que
std::string_viewtiene una copia superficial pero profundas comparaciones. P1085 también tiene una explicación para esto:fuente
std::string_viewseñala. Entonces, digamos,std::map<std::span<T>, U>está tan roto comostd::map<std::string_view, U>. En mi humilde opinión,std::string_viewtampoco debería contener operadores de comparación.