C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Указывает, что экземпляр типа может быть сконструирован из rvalue аргумента.
Содержание |
Требования
Тип
T
удовлетворяет требованиям
MoveConstructible
если
Дано
-
rv, rvalue -выражение типаT, -
u, произвольный идентификатор.
Следующие выражения должны быть корректными и иметь указанные эффекты.
| Выражение | Постусловия |
|---|---|
| T u = rv ; |
Значение
u
эквивалентно значению
rv
до инициализации.
Новое значение
|
| T ( rv ) |
Значение
T(rv)
эквивалентно значению
rv
до инициализации.
Новое значение
|
Примечания
Классу не обязательно реализовывать
move constructor
для удовлетворения этому требованию типа:
copy constructor
принимающий аргумент
const T&
может связывать rvalue выражения.
Если класс
MoveConstructible
реализует перемещающий конструктор, он также может реализовать
семантику перемещения
, чтобы воспользоваться тем фактом, что значение
rv
после конструирования не определено.
| Расширенное содержимое |
|---|
|
Быть классом MoveConstructible подразумевает std::is_move_constructible , но не наоборот, поскольку std::is_move_constructible проверяет только возможность вызова конструктора с правильными аргументами, а не постусловие значения.
Запустить этот код
#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++20)
|
указывает, что объект типа может быть перемещён при конструировании
(концепт) |