命名空间
变体
操作

非传播缓存 (C++20)

来自 cppreference.cn
< cpp‎ | ranges
 
 
范围库 (Ranges library)
范围适配器 (Range adaptors)
辅助项 (Helper items)
(直到 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(*i); 对于某个虚构变量 t 是合法的,否则程序将格式错误。如果 *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() 的结果,以提供该方法的摊销常数时间复杂度。

[编辑] 参阅

一个由展平的 ranges view 得到的序列组成的 view
(类模板) (范围适配器对象)[编辑]
一个 view,由扁平化范围视图获得的序列组成,元素之间带有分隔符
(类模板) (范围适配器对象)[编辑]
一个 view,包含通过分隔符拆分另一个 view 获得的子范围
(类模板) (范围适配器对象)[编辑]
一个 view,包含通过分隔符拆分另一个 view 获得的子范围
(类模板) (范围适配器对象)[编辑]
一个 view 的范围,它是另一个 view 元素的 N 大小的非重叠连续块
(类模板) (范围适配器对象)[编辑]