# no-throw-input-iterator, no-throw-forward-iterator, no-throw-sentinel-for, no-throw-input-range, no-throw-forward-range

< cpp‎ | memory

template<class I> concept no-throw-input-iterator = // 仅用于阐释 std::input_iterator<I> && std::is_lvalue_reference_v<std::iter_reference_t<I>> && std::same_as<std::remove_cvref_t<std::iter_reference_t<I>>, std::iter_value_t<I>>; | (1) | (C++20 起)
template<class I> concept no-throw-forward-iterator = // 仅用于阐释 no-throw-input-iterator<I> && std::forward_iterator<I> && no-throw-sentinel-for<I, I>; | (2) | (C++20 起)
template<class S, class I> concept no-throw-sentinel-for = std::sentinel_for<S, I>; // 仅用于阐释 | (3) | (C++20 起)
template<class R> concept no-throw-input-range = // 仅用于阐释 ranges::range<R> && no-throw-input-iterator<ranges::iterator_t<R>> && no-throw-sentinel-for<ranges::sentinel_t<R>, ranges::iterator_t<R>>; | (4) | (C++20 起)
template<class R> concept no-throw-forward-range = // 仅用于阐释 no-throw-input-range<R> && no-throw-forward-iterator<ranges::iterator_t<R>>; | (5) | (C++20 起)

这些仅用于阐释的概念指定迭代器、哨位和范围上算法所要求的操作均不抛异常。

1) `no-throw-input-iterator` 概念要求解引用迭代器产生左值，类似 `contiguous_iterator` 与老式向前迭代器 (LegacyForwardIterator) 。

### 语义要求

类似所有标准概念，此处列出的每个概念得以实现，仅若其所蕴含的所有概念均被实现。

1) 类型 `I` 实现 `no-throw-input-iterator` ，仅若自增、复制构造、移动构造、复制赋值、移动赋值或通过合法迭代器的间接不抛出异常。
3) 类型 `S` 与 `I` 实现 `no-throw-sentinel-for` ，仅若复制构造、移动构造、复制赋值、移动赋值或类型 `I` 与 `S` 的合法值间的比较不抛异常。
4) 类型 `R` 实现 `no-throw-input-range` ，仅若在 `R` 类型对象上调用 ranges::begin 与 ranges::end 不抛异常。

### 注解

这些概念允许迭代器和哨位上的某些操作抛出异常，例如非法值上的操作。

### 参阅

input_iterator (C++20) | 指定类型为输入迭代器，即可读取其所引用的值，且可前/后自增 (概念)
forward_iterator (C++20) | 指定 `input_iterator` 为向前迭代器，支持相等比较与多趟操作 (概念)
sentinel_for (C++20) | 指定类型为某个 `input_or_output_iterator` 类型的哨位类型 (概念)
ranges::input_range (C++20) | 指定范围的迭代器类型满足 `input_iterator` (概念)
ranges::forward_range (C++20) | 指定范围的迭代器类型满足 `forward_iterator` (概念)