std::ranges::sized_range, std::ranges::disable_sized_range
来自 zh.cppreference.net
| 定义于头文件 <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(1) | (从 C++20 起) (至 C++26) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(从 C++26 起) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (从 C++20 起) |
1) 概念
sized_range 规定了range(至 C++26)approximately_sized_range(从 C++26 起) 类型的要求,该类型能够通过 size 函数在常数时间内获知其大小。2)
disable_sized_range 的存在是为了允许某些范围类型使用它们提供的 size 函数(无论是作为成员函数还是非成员函数),但实际并不符合 sized_range 的要求。用户可以针对无 cv 限定的程序定义类型特化 disable_sized_range。此类特化必须可于常量表达式中使用,并且类型为 const bool。语义要求
1)
给定类型为
std::
remove_reference_t
<
T
>
的左值
t
,当且仅当满足以下条件时
T
才建模
sized_range
:
- ranges:: size ( t )
-
- 具有均摊常数时间复杂度,
- 不会以 保相等 表达式可观测的方式改变 t 的值,且
- 等于 ranges:: distance ( ranges:: begin ( t ) , ranges:: end ( t ) ) ,且
-
若
ranges::
iterator_t
<
T
>
建模
forward_iterator,则无论 ranges:: begin ( t ) 的求值顺序如何, ranges:: size ( t ) 都必须保持良定义(换言之,单遍大小范围可能仅支持在首次调用 begin 前调用 size,但前向范围必须始终支持调用 size)。
注释
disable_sized_range
不能用于选择退出其迭代器和哨位满足
sized_sentinel_for
的范围;必须改用
std::disable_sized_sentinel_for
。
disable_sized_range
不能为数组类型或引用类型进行特化。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range 和 ranges::reserve_hint |
示例
运行此代码
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
参见
|
(C++20)
|
指定其迭代器类型满足
random_access_iterator
的范围
(概念) |
|
(C++20)
|
指定其迭代器类型满足
contiguous_iterator
的范围
(概念) |