Чому в std :: span відсутні оператори порівняння?


10

Хіба не std::spanрозроблена як легка посилання на субрегіони std::vector/ std::array/ простого масиву тощо? Чи не повинен він також містити операторів порівняння у своєму API, щоб вони відповідали їм? Які міркування за виключенням?

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


Велике питання ІМО, мені цікаво те саме. operator==також відсутня. Esp для вектора я часто вважаю зручним порівняти безпосередньо. Це може бути пов'язано з труднощами, можливо, зі статичними типовими розмірами, хоча я не впевнений.
darune

Він схожий на gsl :: span, з якого std :: span, з якого не використовується версія, також не включає ці.
darune

1
@DanielLangr, чому б не лексикографічне порівняння, як std::vectorі std::arrayробити? Вони вже визначені саме так для тих типів, так чому б і тут не було.
Тимо

2
Зауважте, що P0122R7 пропонує порівняння span, але чинний проект стандарту не включає його.
Даніель Лангр

1
@darune gsl::span робить (і завжди була) у операторів порівняння. Вони просто перемістили їх у свій власний заголовок
Баррі

Відповіді:


3

Як зазначив Даніель Лангр , std::spanу своїй початковій пропозиції P0122 є оператори порівняння . Потім ці оператори видаляються з робочого проекту N4791 , а причини вказані в P1085 .

Коротше кажучи, копія та const для 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можна вважати подібною оптимізації копіювання під час запису.


Зауважте, що ніщо не заважає власнику масиву символів змінювати оригінальне сховище, std::string_viewвказуючи на нього. Так, скажімо, так std::map<std::span<T>, U>само зламано std::map<std::string_view, U>. IMHO, std::string_viewтакож не повинен містити операторів порівняння.
Ліберта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.