最終更新日時(UTC):
が更新

履歴 編集

concept
<memory>

std::no-throw-input-iterator(C++20)

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

参照