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

履歴 編集

concept
<iterator>

std::indirectly_copyable_storable(C++20)

namespace std {
  template<class In, class Out>
  concept indirectly_copyable_storable =
    indirectly_copyable<In, Out> &&
    indirectly_writable<Out, iter_value_t<In>&> &&
    indirectly_writable<Out, const iter_value_t<In>&> &&
    indirectly_writable<Out, iter_value_t<In>&&> &&
    indirectly_writable<Out, const iter_value_t<In>&&> &&
    copyable<iter_value_t<In>> &&
    constructible_from<iter_value_t<In>, iter_reference_t<In>> &&
    assignable_from<iter_value_t<In>&, iter_reference_t<In>>;
}

概要

indirectly_copyable_storableは、型In, Outindirectly_copyableの関係にあり、iter_value_t<In>型の中間オブジェクトを介しても、InからOutへその要素のオブジェクトがコピー可能であることを表すコンセプトである。

単純には、型In, Outのオブジェクトをそれぞれin, outとすると次のような代入が可能であることを表している。

const iter_value_t<In> tmp = *in;
*out = tmp;

モデル

間接参照可能な型Inのオブジェクトiについて次の条件を満たす場合に限って、型In, Outindirectly_copyable_storableのモデルである。

次のように初期化されたobjは、その以前に*iが示していた値と等しい(equal)。

iter_value_t<In> obj(*i);

iter_reference_t<In>が右辺値参照型の場合、この初期化の後で*iが示す値は有効だが未規定な状態となる。

#include <iostream>
#include <concepts>
#include <iterator>
#include <vector>
#include <memory>

template<typename In, typename Out>
  requires std::indirectly_copyable_storable<In, Out>
void f(const char* nameIn, const char* nameO) {
  std::cout << nameIn << " is indirectly_copyable_storable " << nameO << std::endl;
}

template<typename In, typename Out>
void f(const char* nameIn, const char* nameO) {
  std::cout << nameIn << " is not indirectly_copyable_storable " << nameO << std::endl;
}


struct del_copy_ctor {
  del_copy_ctor(const del_copy_ctor&) = delete;
};

struct del_copy_assign {
  del_copy_assign& operator=(const del_copy_assign&) = delete;
};

int main() {
  f<int*, int* const>("int*", "int* const");
  f<std::unique_ptr<int>, int*>("std::unique_ptr<int>", "int*");
  f<std::vector<int>::iterator, std::unique_ptr<int>>("std::vector<int>::iterator", "std::unique_ptr<int>");
  f<std::istream_iterator<int>, std::vector<int>::iterator>("std::istream_iterator<int>", "std::vector<int>::iterator");
  f<std::istream_iterator<int>, std::ostream_iterator<int>>("std::istream_iterator<int>", "std::ostream_iterator<int>");

  std::cout << "\n";
  f<int*, const int*>("int*", "const int*");
  f<std::ostream_iterator<int>, std::istream_iterator<int>>("std::ostream_iterator<int>", "std::istream_iterator<int>");
  f<del_copy_ctor*, del_copy_ctor*>("del_copy_ctor*", "del_copy_ctor*");
  f<del_copy_assign*, del_copy_assign*>("del_copy_assign*", "del_copy_assign*");
}

出力

int* is indirectly_copyable_storable int* const
std::unique_ptr<int> is indirectly_copyable_storable int*
std::vector<int>::iterator is indirectly_copyable_storable std::unique_ptr<int>
std::istream_iterator<int> is indirectly_copyable_storable std::vector<int>::iterator
std::istream_iterator<int> is indirectly_copyable_storable std::ostream_iterator<int>

int* is not indirectly_copyable_storable const int*
std::ostream_iterator<int> is not indirectly_copyable_storable std::istream_iterator<int>
del_copy_ctor* is not indirectly_copyable_storable del_copy_ctor*
del_copy_assign* is not indirectly_copyable_storable del_copy_assign*

バージョン

言語

  • C++20

処理系

関連項目

参照