Почему в std :: span отсутствуют операторы сравнения? - PullRequest
10 голосов
/ 11 марта 2020

Разве std::span не был разработан как облегченная ссылка на субрегионы std::vector / std::array / обычный массив и тому подобное? Разве он не должен содержать операторы сравнения в своем API, чтобы соответствовать им? Что послужило причиной исключения?

Примечание: под операторами сравнения я подразумеваю либо полный набор (<, <=, ...), либо космический корабль <=>

1 Ответ

3 голосов
/ 11 марта 2020

Как отметил Даниэль Лангр , 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 аналогично оптимизации копирования при записи.

...