std::ranges::view, std::ranges::enable_view, std::ranges::view_base
来自cppreference.com
| 在标头 <ranges> 定义
|
||
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
| |
(3) | (C++20 起) |
2)
enable_view 变量模板用于指示 range 是否为 view。当且仅当 T 准确拥有一个对于某类型 U 的公开基类 ranges::view_interface<U>,且 T 无任何对于其他类型 V 的基类 ranges::view_interface<V> 时,/*is-derived-from-view-interface*/<T> 为 true。
用户可以针对要实现 view 的无 cv 限定的程序定义类型,将 enable_view 特化为 true,而对不实现的类型特化为 false。这些特化应当可用于常量表达式并拥有 const bool 类型。
语义要求
1)
T 实现 view,仅若:
T的移动构造拥有常数时间复杂度,且- 若从保有 M 个元素的
T对象作出 N 次复制与/或移动,则这 N 个对象拥有 𝓞(N+M) 时间复杂度的析构(这意味着被移动的view对象拥有 𝓞(1) 析构),且 std::copy_constructible<T>为false,或T的复制构造拥有常数时间复杂度,且std::copyable<T>为false,或T拥有不多于析构后随复制构造的时间复杂度。
特化
针对以下各标准模板的所有特化,enable_view 的特化均被定义为 true:
| (C++26 起) |
注解
view 类型的示例为:
- 包装一对迭代器的
range类型,例如std::ranges::subrange<I>。 - 通过 std::shared_ptr 持有其元素并与所有副本共享所有权的
range类型。 - 按需生成其元素的
range类型,例如 std::ranges::iota_view。
诸如 std::vector<std::string> 的可复制容器通常不符合 view 的语义要求,因为复制容器会复制其所有元素,这无法在常数时间内完成。
视图原先被描述成可廉价复制并且为非占有的范围,不过不要求实现 view 的类型为可复制或非占有。然而,它必须仍然有廉价的复制(凡在可能时)、移动、赋值及析构,以令范围适配器不会拥有不期待的复杂度。
实现 movable 和 range 的类型默认被认为是视图,若它公开且无歧义地派生自 view_base 或恰好一个 ranges::view_interface 的特化。
示例
最小化的视图。
#include <ranges>
struct ArchetypalView : std::ranges::view_interface<ArchetypalView>
{
int* begin();
int* end();
};
static_assert(std::ranges::view<ArchetypalView>);
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
