namespace std {
template<class T>
concept move_constructible = constructible_from<T, T> && convertible_to<T, T>;
}
概要
move_constructible
は、任意の型T
がムーブ構築可能であること表すコンセプトである。
モデル
T
がオブジェクト型ならばrv
をT
の右辺値、u2
をrv
と等値なT
のオブジェクトとすると、このrv, u2
について以下の条件を満たす場合に限って型T
はmove_constructible
のモデルである。
T u = rv;
の定義の後ではu
とu2
は等値であることT(rv)
はu2
と等値であることT
がconst
ではないのであれば、上記の2つの条件内の式の後のrv
は有効だが未規定な状態となる。そうでなければrv
は変更されない。- 標準ライブラリの型のオブジェクトはムーブされた後では有効だが未規定な状態となる。
例
#include <iostream>
#include <concepts>
template<std::move_constructible T>
void f(const char* name) {
std::cout << name << " is move constructible" << std::endl;
}
template<typename T>
void f(const char* name) {
std::cout << name << " is not move constructible" << std::endl;
}
struct S {
S(S&&) = delete;
S(int m) : n(m) {}
int n = 0;
};
struct M {
M(M&&) = default;
};
int main() {
f<int>("int");
f<S>("S");
f<M>("M");
}
xxxxxxxxxx
#include <iostream>
#include <concepts>
template<std::move_constructible T>
void f(const char* name) {
std::cout << name << " is move constructible" << std::endl;
}
template<typename T>
void f(const char* name) {
std::cout << name << " is not move constructible" << std::endl;
}
struct S {
S(S&&) = delete;
S(int m) : n(m) {}
int n = 0;
};
struct M {
M(M&&) = default;
};
int main() {
f<int>("int");
f<S>("S");
f<M>("M");
}
出力
int is move constructible
S is not move constructible
M is move constructible
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅