namespace std {
template<class T>
concept copy_constructible =
move_constructible<T> &&
constructible_from<T, T&> && convertible_to<T&, T> &&
constructible_from<T, const T&> && convertible_to<const T&, T> &&
constructible_from<T, const T> && convertible_to<const T, T>;
}
概要
copy_constructible
は、任意の型T
がコピー構築可能であること表すコンセプトである。
モデル
T
がオブジェクト型ならばv
をT
の左辺値(const
付きも含む)もしくはconst T
の右辺値とすると、このv
について以下の条件を満たす場合に限って型T
はcopy_constructible
のモデルである。
T u = v;
の定義の後ではu
とv
は等値であることT(v)
はu
と等値であること
例
#include <iostream>
#include <concepts>
template<std::copy_constructible T>
void f(const char* name) {
std::cout << name << " is copy constructible" << std::endl;
}
template<typename T>
void f(const char* name) {
std::cout << name << " is not copy constructible" << std::endl;
}
struct S {
S(const S&) = delete;
S(int m) : n(m) {}
int n = 0;
};
struct M {
M(M&&) = delete;
};
struct C {
C(const C&) = default;
};
int main() {
f<int>("int");
f<S>("S");
f<M>("M");
f<C>("C");
}
出力
int is copy constructible
S is not copy constructible
M is not copy constructible
C is copy constructible
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅