Não foi std::span
concebido como uma referência leve para sub-regiões de std::vector
/ std::array
/ array simples e similares? Ele também não deve conter operadores de comparação em sua API, para ser consistente com eles? Qual foi o raciocínio por trás da exclusão?
Nota: por operadores de comparação, quero dizer quer o conjunto completo ( <
, <=
...) ou a nave espacial<=>
operator==
também está faltando. Esp. para vetor, costumo achar conveniente comparar diretamente. Talvez devido a dificuldades, talvez com os tipos de tamanho estático, embora não tenha certeza.std::vector
estd::array
faz? Eles já estão definidos assim para esses tipos, então por que não aqui?span
, mas o rascunho do padrão atual não o inclui.gsl::span
tem (e sempre teve) operadores de comparação. Eles apenas os moveram para o seu próprio cabeçalhoRespostas:
Como Daniel Langr apontou ,
std::span
tem operadores de comparação em sua proposta inicial P0122 . Esses operadores são removidos desde o rascunho de trabalho N4791 , e os motivos estão indicados na P1085 .Em resumo, copiar e const for
std::span
são "superficiais" (ou seja, copiar astd::span
não copia seus elementos subjacentes e uma conststd::span
não impede que seus elementos subjacentes sejam modificados); portanto, as comparações, se existir, também devem ser "superficiais" para consistência.Esse documento fornece os seguintes exemplos:
Exemplo 1:
Exemplo 2:
As asserções nesses exemplos podem falhar se
T = std::span
, embora isso não ocorra nos tipos regulares.Pode-se argumentar que
std::string_view
tem cópia superficial, mas comparações profundas. O P1085 também tem uma explicação para isso:fonte
std::string_view
aponta para ele. Então, digamos,std::map<std::span<T>, U>
está tão quebrado quantostd::map<std::string_view, U>
. IMHO,std::string_view
não deve conter operadores de comparação também.