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