std::ranges::sized_range, std::ranges::disable_sized_range

来自cppreference.com
< cpp‎ | ranges
定义于头文件 <ranges>
template< class T >

concept sized_range = ranges::range<T> &&
  ! ranges::disable_sized_range<std::remove_cvref_t<T>> &&
  requires(T& t) {
    ranges::size(t);

  };
(1)
template<class>
inline constexpr bool disable_sized_range = false;
(2)
1) sized_range 概念指定在常数时间内以 size 函数知晓其大小的 range 类型。

正式而言,给定 std::remove_reference_t<T> 类型左值 tT 实现 sized_range 仅若

  • ranges::size(t)
  • 拥有非均摊的常数时间复杂度,
  • 不修改 t ,且
  • 等于 ranges::distance(t) ,而
  • iterator_t<T> 实现 forward_iterator ,则 ranges::size(t) 为良定义,而无关乎 ranges::begin(t) 的求值(换言之,单趟有大小范围可以只在首次调用 begin 前支持调用 size ,但向前范围必须在所有时间支持)
2) disable_sized_range 存在的目的是允许满足但不实际实现 sized_range 的范围类型。

注解

用户可对无 cv 限定的程序定义类型特化 disable_sized_range 。这些特化应当可用于常量表达式并拥有 const bool 类型。