Как отметил Даниэль Лангр , std::span
имеет операторы сравнения в своем первоначальном предложении P0122 . Эти операторы затем удаляются, поскольку рабочий черновик N4791 и причины указаны в P1085 .
Короче говоря, copy и const для std::span
являются "мелкими" «(имеется в виду, что копирование 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
аналогично оптимизации копирования при записи.