Именованные требования C++: MoveConstructible (начиная с C++11)
Указывает, что экземпляр типа может быть сконструирован из аргумента rvalue.
Требования
Тип T удовлетворяет MoveConstructible, если
Даны
-
rv— выражение rvalue типаT, -
u— произвольный идентификатор.
Следующие выражения должны быть корректными и иметь указанные эффекты.
| Выражение | Постусловия |
|---|---|
T u = rv; | Значение u эквивалентно значению rv до инициализации. Новое значение |
T(rv) | Значение T(rv) эквивалентно значению rv до инициализации. Новое значение |
Примечания
Класс не обязан реализовывать конструктор перемещения, чтобы удовлетворять этому требованию к типу: конструктор копирования, принимающий аргумент const T&, может связываться с выражениями rvalue.
Если класс MoveConstructible реализует конструктор перемещения, он также может реализовать семантику перемещения, чтобы воспользоваться тем фактом, что значение rv после конструирования не определено.
| Дополнительное содержимое |
|---|
| Принадлежность класса к MoveConstructible подразумевает #include <iostream>
struct S
{
int n;
S(int in) : n{in} {}
S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
S v{1};
std::cout << "v.n = " << v.n << '\n';
S u = std::move(v);
// Class `S` doesn't satisfy a MoveConstructible requirement
// The value of `u` is NOT equivalent to the value of `v` before the `u` initialization
std::cout << "u.n = " << u.n << '\n';
}
Вывод: v.n = 1 u.n = 2 |
Ссылки
| Дополнительное содержимое |
|---|
|
См. также
|
(C++11)(C++11)(C++11) | проверяет, может ли тип быть сконструирован из ссылки rvalue (шаблон класса) |
|
(C++26)(C++26)(C++26) | проверяет, может ли отражённый тип быть сконструирован из ссылки rvalue (функция) |
|
(C++20) | указывает, что объект типа может быть сконструирован перемещением (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/MoveConstructible