非传播缓存 (C++20)

来自cppreference.com
< cpp‎ | ranges


 
 
范围库
范围适配器
辅助项
(C++23 前)  (C++23)
non-propagating-cache


 
template<class T >

    requires std::is_object_v<T>

class/*non-propagating-cache*/;
(C++20 起)
(仅用于阐述*)

ranges::join_viewranges::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
{
    if(std::addressof(other)!= this)
        reset();
    return*this;

}
(1) (C++20 起)
constexpr/*non-propagating-cache*/&

    operator=(/*non-propagating-cache*/&& other )noexcept
{
    reset();
    other.reset();
    return*this;

}
(2) (C++20 起)
1) 复制赋值运算符会清除 *this 的缓存。
2) 移动赋值运算符会同时清除 *thisother 的缓存。

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 类型的纯右值,那么它不必是可移动的。

等同于 std::optional 的成员

成员函数

构造 optional 对象
(std::optional<T> 的公开成员函数)[编辑]
销毁容纳的值(如果存在)
(std::optional<T> 的公开成员函数)[编辑]
对内容赋值
(std::optional<T> 的公开成员函数)[编辑]
观察器
访问所含值
(std::optional<T> 的公开成员函数)[编辑]
检查对象是否含值
(std::optional<T> 的公开成员函数)[编辑]
修改器
销毁任何所含值
(std::optional<T> 的公开成员函数)[编辑]
原位构造所含值
(std::optional<T> 的公开成员函数)[编辑]

[编辑]注解

non-propagating-cache 在实现中用于缓存 begin() 的结果,以提供均摊常量时间复杂度的方法。

[编辑]参阅

由拉平 range 组成的 view 所获得的序列构成的 view
(类模板)(范围适配器对象)[编辑]
由拉平范围组成的视图并以分隔符间隔所获得的序列构成的 view
(类模板)(范围适配器对象)[编辑]
用某个分隔符切割另一 view 所获得的子范围的 view
(类模板)(范围适配器对象)[编辑]
用某个分隔符切割另一 view 所获得的子范围的 view
(类模板)(范围适配器对象)[编辑]
另一个视图元素的 N 大小不重叠的连续块组成的 view 的范围
(类模板)(范围适配器对象)[编辑]
close