最終更新日時(UTC): 2024年06月11日 13時45分38秒
Akira Takahashi が更新

履歴 編集

concept
<iterator>

# std::indirectly_copyable(C++20)

    namespace std {
      template<class In, class Out>
      concept indirectly_copyable =
        indirectly_readable<In> &&
        indirectly_writable<Out, iter_reference_t<In>>;
    }

## 概要

`indirectly_copyable`は、`indirectly_readable`な型`In`から`indirectly_writable`な型`Out`へ、その要素のオブジェクトがコピー可能であることを表すコンセプトである。

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

## 例

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

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

    template<typename In, typename Out>
    void f(const char* nameIn, const char* nameO) {
      std::cout << nameIn << " is not indirectly_copyable " << 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>");
      f<del_copy_ctor*, del_copy_ctor*>("del_copy_ctor*", "del_copy_ctor*");

      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_assign*, del_copy_assign*>("del_copy_assign*", "del_copy_assign*");
    }

### 出力

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

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

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 6 ✅

## 関連項目

- C++20 コンセプト
- `indirectly_copyable_storable`

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)