std::ranges::sized_range, std::ranges::disable_sized_range
来自 cppreference.cn
定义于头文件 <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-unqualified 的程序定义类型特化 disable_sized_range
。此类特化应可在 常量表达式 中使用,并具有类型 const bool。目录 |
[edit] 语义要求
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)。
[edit] 注意
disable_sized_range
不能用于选择退出其迭代器和哨兵满足 sized_sentinel_for
的范围;必须改用 std::disable_sized_sentinel_for。
disable_sized_range
不能为数组类型或引用类型进行特化。
[edit] 示例
运行此代码
#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() {}
[edit] 参阅
(C++20) |
指定其迭代器类型满足 random_access_iterator 的范围(概念) |
(C++20) |
指定其迭代器类型满足 contiguous_iterator 的范围(概念) |