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

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

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

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

Ответ 1

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

Ответ 2

В CppCoreGuidlines Оригинальный array_view был переименован в span.

Смотрите: https://github.com/isocpp/CppCoreGuidelines/pull/377

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

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

Ответ 3

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

Changelog

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

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

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

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

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

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

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

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

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

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

[...]


См. также Обзор поддержки поддержки поддержки: span<T> от Marius Bancila (март 2016), определяющий span как:

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

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