非传播缓存 (C++20)
来自cppreference.com
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 t(*i); 良构,否则程序非良构。如果 *i 是可能 cv 限定的 T
类型的纯右值,那么它不必是可移动的。
注解
non-propagating-cache
在实现中用于缓存 begin() 的结果,以提供均摊常量时间复杂度的方法。
参阅
(C++20) |
由拉平 range 组成的 view 所获得的序列构成的 view (类模板) (范围适配器对象) |
由拉平范围组成的视图并以分隔符间隔所获得的序列构成的 view (类模板) (范围适配器对象) | |
用某个分隔符切割另一 view 所获得的子范围的 view (类模板) (范围适配器对象) | |
用某个分隔符切割另一 view 所获得的子范围的 view (类模板) (范围适配器对象) | |
另一个视图元素的 N 大小不重叠的连续块组成的 view 的范围 (类模板) (范围适配器对象) |