C++ 4. Реализация std::move, rvalue and lvalue + Семинар

preview_player
Показать описание
С++ . МФТИ

Дата лекции: 06.03.2023
Лектор: Мещерин Илья Семирович
Монтажер: Алиев Арлан
Оператор: Катя Порай

0:00:00 - начало, поддержка move для своих объектов (продолжение п. 10.2)
0:19:46 - реализация std::move (п. 10.3)
0:38:00 - rvalue and lvalue (п. 10.4)
1:09:10 - rvalue references и их свойства (п. 10.5)
1:28:40 - конец лекции
1:30:30 - начало семинара, auto (п. 11.1), примеры auto в аргументах функций
2:05:24 - примеры auto как возвращаемого типа функций
2:26:27 - переменные auto
2:34:23 - decltype (п. 11.2)
2:45:20 - decltype(auto)
2:49:55 - конец
Рекомендации по теме
Комментарии
Автор

2:20:55 упрт, но inline в текущих плюсах не несёт смысла инлайнинга (встраивания) функций. Оно означает исключение из ODR, поэтому определение функции может встречаться в разных единицах трансляции, и это не UB. Федя все ровно сказал, но в зале слышится недопонимание этого момента

makaedg
Автор

Константная rvalue reference может понадобиться, чтобы запретить вызывать функцию для временного объекта. Если удалить неконстантную rvalue ref перегрузку, то для временного объекта все равно вызовется перегрузка от const T&. А если вместо удалить перегрузку для const T&&, то тогда будет ошибка компиляции

makaedg
Автор

Да где этот ваш Федя?! :))) Почему нет занятий с Федей в записи :( Или есть?

alexvideolib
Автор

Странный порядок объяснения конечно, но ок. Как-то слишком много магии в голове образуется.
Вкратце я бы описал это так:
Исходя из того, что тип это возможный набор операций над значениями возьмём обыкновенные выражения из языка и посмотрим на них(и их типы) внимательно:

int* p = &val;
*p = 4;
5 = 4; // Ошибка компиляции

Какого типа выражение *p ? Ошибочно было бы считать, что тип int, ведь 5 = 4 не компилируется, а 5 казалось бы обладает таким же типом int.
Оказывается, что в языке С такого типа нет, ничего не остается, кроме как поверить, что оно работает.

Потом приходит С++98 и добавляет ссылки(lvalue ссылки) и мы осознаем, что *p имеет тип int& и именно поэтому ему можно присваивать.
На этом этапе мы могли бы подумать, что 5 = 4 не компилируется, потому что 5 обладает типом int, а не int&, но посмотрим на следующие выражения

const int& i = 5; // компилируется
int& j = 5; // не компилируется
int x = 5;
int& xref = x; // компилируется

То есть, мы можем сделать неконстантную ссылку на int x, но не можем сделать неконстантную ссылку на '5', хотя до сих пор считаем, что 5 обладает типом int. Значит мы ошибались и тип этого выражения другой!

И тут приходит C++11 и вводит этот тип, rvalue ссылки или T&& и оказывается, что 5 всё это время обладало типом int&&, который неявно приводится к const int&


Вот и всё, никакой магии, просто 2 вида ссылок + каст из T&& в const T&

Fokin
Автор

Почему нельзя объяснять move через то, что под капотом у компилятора? Будет все ясно за 15 минут.

gontnetwork
welcome to shbcf.ru