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) |
view определяет требования к типу range, имеющему подходящие семантические свойства для использования в конвейерах адаптеров диапазонов.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.Семантические требования
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