І те, std::forward
і std::move
інше - лише касти.
X x;
std::move(x);
Вище наведено вираз lvalue x
типу X на вираз rvalue типу X (точне значення x). move
Ви також можете прийняти оцінку:
std::move(make_X());
і в цьому випадку це функція ідентичності: приймає ревальвінг типу X і повертає ревальвінг типу X.
З std::forward
ви можете вибрати пункт призначення в деякій мірі:
X x;
std::forward<Y>(x);
Віддає вираз значення l x
типу X на вираз типу Y. Існує обмеження щодо того, яким може бути Y.
Y може бути доступною базою X, або посиланням на базу X. Y може бути X, або посиланням на X. Не можна відкидати cv-кваліфікаторів forward
, але можна додати cv-кваліфікатори. Y не може бути типом, який може бути конвертованим лише з X, за винятком доступного перетворення Base.
Якщо Y - посилання на значення, результатом буде вираз lvalue. Якщо Y не є посиланням на значення, результатом буде вираз rvalue (xvalue, якщо бути точним).
forward
може приймати аргумент rvalue лише в тому випадку, якщо Y не є посиланням на значення. Тобто, ви не можете кидати ревальвінг на значення. Це з міркувань безпеки, оскільки це зазвичай призводить до звисання посилань. Але введення рейтингу в rvalue нормально і дозволено.
Якщо ви спробуєте вказати Y на щось, що не дозволено, помилка буде схоплена під час компіляції, а не час виконання.