非传播缓存 (C++20)
来自 cppreference.cn
template< class T > requires std::is_object_v<T> |
(自 C++20 起) (仅为说明目的*) |
|
一些范围适配器,例如 ranges::join_view 和 ranges::lazy_split_view 有条件地存储值(例如,迭代器),该值根据仅用于说明的类模板 non-propagating-cache
指定。
该包装器行为完全类似于 std::optional<T>,除了
- 当复制构造或赋值时,它不复制源的值,
- 当从其移动时,它重置源的值,
- 当从其赋值时,它重置其值,并且
- 它还提供了一个成员函数模板,以使输入视图能够在迭代时临时缓存值。
该包装器封装了一个包含值的缓存。清除缓存是等效于重置包含值的操作。当复制或移动包装器时,执行此类操作。
目录 |
[编辑] 模板形参
T | - | 包含值的类型,必须是对象类型 |
[编辑] 成员函数
复制和移动构造函数
constexpr /*non-propagating-cache*/ ( const /*non-propagating-cache*/& ) noexcept {} |
(1) | (自 C++20 起) |
constexpr /*non-propagating-cache*/ ( /*non-propagating-cache*/&& other ) noexcept { other.reset(); } |
(2) | (自 C++20 起) |
1) 复制构造函数没有效果。
2) 移动构造函数清除 other 的缓存。
复制和移动赋值运算符
constexpr /*non-propagating-cache*/& operator=( const /*non-propagating-cache*/& other ) noexcept |
(1) | (自 C++20 起) |
constexpr /*non-propagating-cache*/& operator=( /*non-propagating-cache*/&& other ) noexcept |
(2) | (自 C++20 起) |
1) 复制赋值运算符清除 *this 的缓存。
2) 移动赋值运算符清除 *this 和 other 的缓存。
non-propagating-cache<T>::emplace-deref
template< class I > constexpr T& /*emplace-deref*/( const I& i ); |
(自 C++20 起) (仅为说明目的*) |
|
通过使用 *i 进行直接初始化(但不是直接列表初始化)来初始化包含的值。如果 *this 在调用之前已包含值,则调用 reset()。
返回对新包含值的引用。
除非声明 T t(*i); 对于某些虚构变量 t 格式良好,否则程序是非良构的。如果 *i 是可能具有 cv 限定的 T
的纯右值,则不需要它是可移动的。
[编辑] 注释
non-propagating-cache
在实现中用于缓存 begin() 的结果,以提供该方法的摊销常数时间复杂度。
[编辑] 参见
(C++20) |
由展平 range 的 view 获得的序列组成的 view (类模板) (范围适配器对象) |
由展平 range 的 view 获得的序列组成的 view ,元素之间带有分隔符(类模板) (范围适配器对象) | |
在通过使用分隔符拆分另一个 view 获得的子范围上的 view (类模板) (范围适配器对象) | |
在通过使用分隔符拆分另一个 view 获得的子范围上的 view (类模板) (范围适配器对象) | |
N 大小的非重叠连续块的 view 的范围,这些块是另一个 view 的元素(类模板) (范围适配器对象) |