Namespaces
Variants

Non-propagating cache (C++20)

From cppreference.net
Ranges library
Range adaptors
Helper items
(until C++23) (C++23)
non-propagating-cache


template < class T >

requires std:: is_object_v < T >

class /*non-propagating-cache*/ ;
(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) (since C++20)
constexpr /*non-propagating-cache*/
( /*non-propagating-cache*/ && other ) noexcept { other. reset ( ) ; }
(2) (since 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) (since C++20)
constexpr /*non-propagating-cache*/ &

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

}
(2) (since 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 类型纯右值,则不要求其可移动。

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 s view 所获得的序列组成的 view
(类模板) (范围适配器对象)
由展平范围视图并在元素间插入分隔符所获得的序列组成的 view
(类模板) (范围适配器对象)
通过使用分隔符拆分另一个 view 所获得的子范围组成的 view
(类模板) (范围适配器对象)
通过使用分隔符拆分另一个 view 所获得的子范围组成的 view
(类模板) (范围适配器对象)
由另一个 view 元素的 N 大小非重叠连续块组成的 view s 范围
(类模板) (范围适配器对象)