namespace std {
template <class I>
concept no-throw-input-iterator =
input_iterator<I> &&
is_lvalue_reference_v<iter_reference_t<I>> &&
same_as<remove_cvref_t<iter_reference_t<I>>, iter_value_t<I>>;
}
概要
no-throw-input-iterator
は、イテレータ型I
が以下の操作で例外を投げない入力イテレータの説明用コンセプトである:
- インクリメント
- コピー構築
- ムーブ構築
- コピー代入
- ムーブ代入
- 有効なイテレータの間接参照
備考
- このコンセプトは
input_iterator
のいくつかの操作で例外を投げることを許可する - このコンセプトは、
std::vector<bool>
のイテレータのような、プロキシオブジェクトを指すイテレータを除外する
例
#include <iostream>
#include <concepts>
#include <iterator>
#include <memory>
#include <vector>
#include <forward_list>
#include <list>
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>>;
template <no_throw_input_iterator I>
void f(const char* name) {
std::cout << name << " is no-throw-input-iterator" << std::endl;
}
template<typename I>
void f(const char* name) {
std::cout << name << " is not no-throw-input-iterator" << std::endl;
}
int main() {
f<int*>("int*");
f<const int*>("const int*");
f<std::forward_list<int>::iterator>("std::forward_list<int>::iterator");
f<std::list<int>::iterator>("std::list<int>::iterator");
f<std::vector<int>::iterator>("std::vector<int>::iterator");
f<std::vector<bool>::iterator>("std::vector<bool>::iterator");
std::cout << "\n";
}
出力
int* is no-throw-input-iterator
const int* is no-throw-input-iterator
std::forward_list<int>::iterator is no-throw-input-iterator
std::list<int>::iterator is no-throw-input-iterator
std::vector<int>::iterator is no-throw-input-iterator
std::vector<bool>::iterator is not no-throw-input-iterator