В чем разница между представлением span и array в библиотеке 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после обратной связи от ЛЬЮГА на собрании Кона.- [...]
мы также можем прочесть:
воздействие на уровень
это предложение является чистым расширением библиотеки. Он не требует никаких изменений в стандартных классов, функций и заголовков. Это было бы улучшено, если бы могло зависеть от
byteтип и изменения в поведении сглаживания типов, предлагаемые в P0257.однако - если принято – может быть полезно перегрузить некоторые стандартные функции библиотеки для этот новый тип (например,
copy()).
spanбыл реализован в стандартном C++ (C++11) и успешно выполняется используется в коммерческом инструменте статического анализа для кода C++, а также в коммерческом офисном программном обеспечении. Реализация с открытым исходным кодом, ссылка доступна по адресуhttps://github.com/Microsoft/GSL.в следующей главе этот документ представляет только для чтения и читать-писать (mutable запись):
типы элементов и преобразования
spanдолжен быть настроен с типом элемента через параметр шаблонаValueType, который должен быть полным типом объекта это не абстрактный тип класса.spanподдерживает только чтение или изменяемый доступ к последовательности, которую он инкапсулирует. Для доступа к данным только для чтения пользователь может объявитьspan<const T>, и доступ к изменяемые данные будут использоватьspan<T>.[...]
см. также Обзор Библиотеки Поддержки Руководящих Принципов:
span<T>от Marius Bancila (март 2016) определениеspanкак:The Библиотека Поддержки Руководящих Принципов внедрение Microsoft некоторых типов и функций, описанных в Основные Принципы C++ поддерживается стандартный C++ Foundation. Среди типов, предоставляемых GSL является
span<T>ранее известный какarray_view<T>.
span<T>это не владеющий диапазон непрерывной памяти рекомендуется использовать вместо указатели (и счетчик размеров) или стандартные контейнеры (например,std::vectorилиstd::array).
Comments