170 похожих чатов

Type&& — r-value ссылка, которая говорит, что у объекта можно

забрать владение
std::move — просто static_cast к &&

void foo(Type&& object) — у object можно забрать владение, и хоть это RVALUE ссылка, сам объект LVALUE (простое правило: всё имеет имя — lvalue). Если владение передаётся где-то в другой функции, которая вызывается из foo, надл сделать std::move(object)

После выполнения перемещения (не просто std::move, а вызвали конструктор/оператор= перемещения) объект, из которого мувнули находится в unspecified состоянии, на котором можно вызывать деструктор и операции, которые не требуют preconditions. Это относится к стд классам, но обычно и остальные библиотеко-писатели делают аналогично.
Использование такого объекта не даёт ошибку компиляции как в Расте. Хотя скорее всего статанализатор ругнётся.

Теперь про более сложную часть

template <typename T>
void foo(T&& o);
T&& — это не rvalue reference, а forwarding. Forwarding reference может принимать как rvalue, так и lvalue ссылки.
Правило такое: если пришла lvalue ссылка, то o будет иметь тип [const] T&, а если rvalue ссылка или временный объект — то просто T

А что если мы захотим передать этот объект куда-то. Причем если там пришёл объект из которого можно мувнуть — мы хотим мувнуть? (то бишь пришла не lvalue ссылка)
std::move здесь не подойдёт, потому что он превратит всё к && — даже то, что мы не хотим

Поэтому используется std::forward, который мувает только если изначальный объект был rvalue ссылкой, иначе просто передаёт lvalue ссылку.

Надеюсь, что-то было понятно.
За подробностями к Майерсу или Джоссатису.
Майерс forwarding reference называет "универсальной ссылкой"

3 ответов

25 просмотров

Всё классно, только ВЛАДЕНИЕ тут причём?

Я был бы аккуратнее с фразой >> std::move — просто static_cast к && потому что на самом деле, так выглядит форвард (при касте происходит сжатие ссылок), а не мув (который предвариательно требует стереть ссылку с типа, чтобы при добавлении && не произошло сжатие)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта