Разве это не было std::span
разработано как облегченная ссылка на подобласти массиваstd::vector
/ std::array
/ plain ? Разве он не должен содержать операторы сравнения в своем API, чтобы соответствовать им? Что было причиной исключения?
Примечание: операторы сравнения, я имею в виду либо полный набор ( <
, <=
, ...) или космический корабль<=>
operator==
также отсутствует. Особенно для вектора мне часто удобно сравнивать напрямую. Это может быть связано с трудностями, возможно, со статическими типами размеров диапазона, хотя я не уверен.std::vector
иstd::array
делать? Они точно так же определены для этих типов, так почему бы и нет.span
, но текущий проект стандарта не включает его.gsl::span
есть (и всегда были) операторы сравнения. Они просто перенесли их в свой заголовокОтветы:
Как отметил Даниэль Лангр ,
std::span
операторы сравнения в своем первоначальном предложении P0122 . Эти операторы затем удаляются с рабочего проекта N4791 , а причины указываются в P1085 .Короче говоря, copy и const for
std::span
являются «мелкими» (это означает, что копирование astd::span
не копирует свои базовые элементы, а conststd::span
не препятствует изменению его базовых элементов), поэтому сравнения, если они существуют, также должны быть «мелкими» для согласованности.В этой статье приводятся следующие примеры:
Пример 1:
Пример 2:
Утверждения в этих примерах могут потерпеть неудачу, если
T = std::span
это не так для обычных типов.Можно утверждать, что
std::string_view
имеет мелкую копию, но глубокие сравнения. У P1085 также есть объяснение этому:источник
std::string_view
указывает на него. Так что, скажем,std::map<std::span<T>, U>
сломан какstd::map<std::string_view, U>
. ИМХО,std::string_view
не должно содержать операторов сравнения.