¿No fue std::span
diseñ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::vector
ystd::array
hacer? Ya se definen así para esos tipos, entonces, ¿por qué no aquí?span
, pero el borrador del estándar actual no lo incluye.gsl::span
tiene (y siempre tuvo) operadores de comparación. Simplemente los movieron a su propio encabezadoRespuestas:
Como señaló Daniel Langr ,
std::span
tiene 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::span
son "superficiales" (lo que significa que copiar unstd::span
no copia sus elementos subyacentes, y un conststd::span
no 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_view
tiene una copia superficial pero profundas comparaciones. P1085 también tiene una explicación para esto:fuente
std::string_view
señ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_view
tampoco debería contener operadores de comparación.