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 ✅