std::ranges::sized_range, std::ranges::disable_sized_range
来自 cppreference.com
定义在头文件 <ranges> 中 |
||
template< class T > concept sized_range = ranges::range<T> && |
(1) | (自 C++20) |
template< class > constexpr bool disable_sized_range = false; |
(2) | (自 C++20) |
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::size(t) 在 ranges::begin(t) 的评估(换句话说,单遍大小范围可能仅在第一次调用 begin 之前支持对 size 的调用,但前向范围必须始终支持 size)。
[编辑] 注意
disable_sized_range
不能用于选择退出其迭代器和哨兵满足 sized_sentinel_for
的范围;应改为使用 std::disable_sized_sentinel_for。
disable_sized_range
无法为数组类型或引用类型专门化。
[编辑] 示例
运行此代码
#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 的范围(概念) |