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。内容 |
[编辑] 语义要求
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) 的求值无关(换句话说,单程 sized range 可能仅在首次调用 begin 之前支持调用 size,但 forward range 必须始终支持 size)。
[编辑] 注解
disable_sized_range
不能用于选择退出迭代器和 sentinel 满足 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 的范围(概念) |