Как отметил Даниэль Лангр , std::span
операторы сравнения в своем первоначальном предложении P0122 . Эти операторы затем удаляются с рабочего проекта N4791 , а причины указываются в P1085 .
Короче говоря, copy и const for std::span
являются «мелкими» (это означает, что копирование a std::span
не копирует свои базовые элементы, а const std::span
не препятствует изменению его базовых элементов), поэтому сравнения, если они существуют, также должны быть «мелкими» для согласованности.
В этой статье приводятся следующие примеры:
Пример 1:
T oldx = x;
change(x);
assert(oldx != x);
return oldx;
Пример 2:
void read_only(const T & x);
void f()
{
T tmp = x;
read_only(x);
assert(tmp == x);
}
Утверждения в этих примерах могут потерпеть неудачу, если T = std::span
это не так для обычных типов.
Можно утверждать, что std::string_view
имеет мелкую копию, но глубокие сравнения. У P1085 также есть объяснение этому:
Это соответствует string_view
, однако string_view
не может изменить элементы, на которые оно указывает, и, таким образом, мелкая копия string_view
может рассматриваться как подобная оптимизации копирования при записи.
operator==
также отсутствует. Особенно для вектора мне часто удобно сравнивать напрямую. Это может быть связано с трудностями, возможно, со статическими типами размеров диапазона, хотя я не уверен.