- concepts[meta header]
- concept[meta id-type]
- std[meta namespace]
- cpp20[meta cpp]
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>;
}
- move_constructible[link /reference/concepts/move_constructible.md]
- constructible_from[link /reference/concepts/constructible_from.md]
- convertible_to[link /reference/concepts/convertible_to.md]
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");
}
- std::copy_constructible[color ff0000]
int is copy constructible
S is not copy constructible
M is not copy constructible
C is copy constructible
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 3 [mark verified]