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

Другие вопросы по тегам