В чем разница между span и array_view в библиотеке gsl?
В нескольких недавних выступлениях на конференции я слышал, как Бьярн Страуструп и другие упоминают новые правила кодирования для C++ и некоторые типы, поддерживающие их.
В частности, я помню пример span<T>
вместо (T* p, int n)
в качестве параметра функции (во время разговора около 32:00); но я также помню предложение использовать array_view<T>
, Это две альтернативы, но одна и та же концепция? Или я путаю вещи, и они на самом деле не так уж связаны?
Я не могу найти какого-либо авторитетного определения того, о чем они оба должны быть.
3 ответа
Мы разговаривали с людьми из рабочей группы библиотеки в комитете по стандартам. Они хотели array_view
они пытаются попасть в стандарт только для чтения. Для основных рекомендаций нам нужна была абстракция, которая читалась и писалась. Чтобы избежать противоречий между (потенциальными) стандартами и библиотекой поддержки руководящих принципов (GSL), мы переименовали нашу (чтение и запись) array_view
в span
: https://github.com/microsoft/gsl.
В CppCoreGuidlines оригинал array_view
был переименован в span
,
См.: https://github.com/isocpp/CppCoreGuidelines/pull/377
Это описано так:
span - проверенная граница, безопасная альтернатива использованию указателей для доступа к массивам
Документ 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++, поддерживаемых Standard C++ Foundation. Среди типов, предоставляемых GSL, есть
span<T>
ранее известный какarray_view<T>
,
span<T>
это несобственный диапазон непрерывной памяти, который рекомендуется использовать вместо указателей (и счетчиков размеров) или стандартных контейнеров (таких какstd::vector
или жеstd::array
).