В чем разница между span и array_view в библиотеке gsl?

В нескольких недавних выступлениях на конференции я слышал, как Бьярн Страуструп и другие упоминают новые правила кодирования для C ++ и некоторые типы, поддерживающие их.

Конкретно я помню пример span<T> вместо (T* p, int n) как параметр функции (во время разговора около 32:00); но я также помню предложение использовать array_view<T>, Это две альтернативы, но одна и та же концепция? Или я путаю вещи, и они на самом деле не так уж связаны?

Я не могу найти какого-либо авторитетного определения того, о чем они оба должны быть.

80

Решение

Мы говорили с людьми в рабочая группа библиотеки в комитет по стандартам. Они хотели array_view они пытаются попасть в стандарт только для чтения. Для основных рекомендаций нам нужна была абстракция, которая читалась и писалась. Чтобы избежать противоречий между (потенциальными) стандартами и библиотекой поддержки руководящих принципов (GSL), мы переименовали нашу (чтение и запись) array_view в span: https://github.com/microsoft/gsl .

162

Другие решения

в CppCoreGuidlines Оригинал array_view был переименован в span,

Увидеть: https://github.com/isocpp/CppCoreGuidelines/pull/377

Это описано так:

span — проверенная граница, безопасная альтернатива использованию указателей для доступа к массивам

41

Документ P0122R (2016-02-12) из Рабочая группа по эволюции библиотек (LEWG)
официально переименовывает тип array_view в span:

Изменения

Изменения от R0

  • Изменено название предлагаемого типа из array_view в span после обратной связи от LEWG на собрании Kona.
  • […]

Мы также можем прочитать:

Влияние на стандарт

Это предложение является чистым расширением библиотеки.
Он не требует каких-либо изменений стандартных классов, функций или заголовков.
Было бы улучшено, если мог бы зависит от byte тип
и изменения в поведении псевдонимов типа, предложенных в P0257.

Однако, если он будет принят, может быть полезно перегрузить некоторые стандартные библиотечные функции для этого нового типа (например, copy()).

span был реализован в стандарте C ++ (C ++ 11) и успешно
используется в коммерческом инструменте статического анализа для кода C ++, а также в коммерческом офисном программном обеспечении.
Открытый исходный код, справочная реализация доступна на https://github.com/Microsoft/GSL.

В следующей главе этот документ представляет только для чтения а также читай пиши (изменчивый) доступы:

Типы элементов и преобразования

span должен быть настроен с его типом элемента
через параметр шаблона ValueType,
который должен быть полным типом объекта
это не абстрактный тип класса.
span поддерживает доступ только для чтения или изменяемый доступ к последовательности, которую он инкапсулирует.
Для доступа к данным только для чтения пользователь может объявить span<const T>,
и доступ к изменяемым данным будет использовать span<T>,

[…]

Смотрите также Руководство поддержки библиотек span<T> от Мариуса Банчилы (март 2016) span как:

Библиотека поддержки руководства это реализация Microsoft
некоторых типов и функций, описанных в Основные положения C ++
поддерживается Стандарт C ++ Foundation.
Среди типов, предоставляемых GSL, есть span<T> ранее известный как array_view<T>,

span<T> это несобственный диапазон непрерывной памяти, который рекомендуется использовать вместо
указатели (и счетчик размера) или стандартные контейнеры (такие как std::vector или же std::array).

11