Какая разница между 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
).