Spec-Zone.ru › C++

std::ranges::view, std::ranges::enable_view, std::ranges::view_base

Определено в заголовке <ranges>
template<class T>
concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>;
(1) (с C++20)
template<class T>
inline constexpr bool enable_view =
    std::derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
(2) (с C++20)
struct view_base { };
(3) (с C++20)
1) Концепция view определяет требования к типу range, имеющему подходящие семантические свойства для использования в конвейерах адаптеров диапазонов.
2) Шаблон-переменная enable_view используется для указания, является ли range view. /*is-derived-from-view-interface*/<T> равно true тогда и только тогда, когда T имеет ровно один публичный базовый класс ranges::view_interface<U> для некоторого типа U, и T не имеет базовых классов типа ranges::view_interface<V> для любого другого типа V.
Пользователи могут специализировать enable_view на true для cv-неквалифицированных типов, определенных программой, которые моделируют view, и на false для типов, которые не моделируют их. Такие специализации должны быть использованы в выражениях константного времени и иметь тип const bool.
3) Наследование от view_base позволяет типам range моделировать view.

Семантические требования

1) T моделирует view только если:
  • перемещающее создание T имеет сложность выполнения в константное время, и
  • если выполняется \(\scriptsize N\)N копий и/или перемещений из объекта T, содержащего \(\scriptsize M\)M элементов, то эти \(\scriptsize N\)N объекты имеют сложность уничтожения \(\scriptsize \mathcal{O}{(N+M)}\)𝓞(N+M) (что подразумевает, что уничтожение объекта view после перемещения имеет сложность \(\scriptsize \mathcal{O}{(1)}\)𝓞(1)), и
  • либо std::copy_constructible<T> является false, либо создание копии T имеет сложность выполнения в константное время, и
  • либо std::copyable<T> является false, либо присвоение копии T не имеет большей сложности, чем уничтожение, за которым следует создание копии.

Примечания

Примеры типов view:

  • Тип range, который оборачивает пару итераторов, например, std::ranges::subrange<I>.
  • Тип range, который хранит свои элементы по std::shared_ptr и разделяет владение со всеми своими копиями.
  • Тип range, который генерирует свои элементы по требованию, например, std::ranges::iota_view.

Копируемый контейнер, такой как std::vector<std::string> обычно не удовлетворяет семантическим требованиям view, поскольку копирование контейнера копирует все элементы, что нельзя сделать за константное время.

Хотя первоначально представления описывались как дешево копируемые и невладеющие диапазоны, тип не обязан быть копируемым или невладеющим, чтобы моделировать view. Однако он по-прежнему должен быть дешевым для копирования (если он копируется), перемещения, присваивания и уничтожения, чтобы адаптеры диапазонов не имели непредвиденной сложности.

По умолчанию тип, моделирующий movable и range, считается представлением, если он публично и однозначно наследуется от view_base, или является точной специализацией std::ranges::view_interface.

Отчеты о дефектах

Следующие поведенческие отчеты о дефектах были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применен к Поведение при публикации Корректное поведение
P2325R3 C++20 view требовало default_initializable не требует
LWG 3549 C++20 enable_view не обнаруживал наследование от view_interface обнаруживает
P2415R2 C++20 ограничение на сложность уничтожения было слишком строгим смягчено

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API