Магистерский курс C++ (МФТИ, 2022-2023). Лекция 11. Вывод типов.

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

На этой лекции мы поговорим о выводе типов, но начнём с правых ссылок. Мы надолго задержимся на перегрузке по ссылкам, вспомним на новом уровне копирование, перемещение и проброс, declval и decltype(auto). Завершение лекции -- систематчиеское изложение примеров Йосьютиса, которое имеет целью сделать их не столько пугающими сколько поучительными.

Лектор: Константин Владимиров.
Дата лекции: 16 ноября 2022 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Правые ссылки
13:28 Перегрузка по ссылкам
22:06 Копирование, перемещение и правило пяти
32:57 Moved-from и аннотации
38:50 Правила для auto и универсальные ссылки
48:50 Мотивация и правила decltype и declval
57:00 Магия decltype(auto)
01:05:26 Perfect forwarding
01:11:58 Примеры Йосьютиса
01:26:04 Литература и завершение

Errata:
* 1:02:00 в первом assert должно быть decltype((x))
Рекомендации по теме
Комментарии
Автор

Спасибо, первые 20 минут были очень хороши для понимания не магистрами.

denis_iii
Автор

54:50 страшно за людей в 98-м году, которые бы увидели этот С++11 код

ext
Автор

Могу ошибаться, кажется, слайд 14 содержит ещё проверку на внимательность, default ctor тоже не будет определён автоматически [class.default.ctor]. Соответственно при создании объекта b1 нужно будет передать аргумент или явно определить соответствующий ctor.

meshcheriakov
Автор

Спасибо за отличные лекции! Следующая лекция уже существует, в описании возможно обновить строку: "Следующая лекция: TBD."

meshcheriakov
Автор

16:47 Константин, к сожалению здесь вы не совсем правы: "In C++ class and array prvalues can have cv-qualified types. This differs from ISO C, in which non-lvalues never have cv-qualified types." ([expr#footnote-45]). Согласно [conv.rval] const prvalue (типа класса) материализуется в const glvalue, что и происходит при инициализации ссылки от prvalue. ([dcl.init.ref#5.3])
Пример
#include <iostream>

struct S {};

void foo(S &) { std::cout << '1'; }
void foo(S &&) { std::cout << '2'; }
void foo(S const &) { std::cout << '3'; }
void foo(S const &&) { std::cout << '4'; }

S const bar() { return {}; }

int main() {
foo(bar()); // 4
return 0;
}
И разумеется, если оставить только 1 и 2, получим сообщение об ошибке о потере const квалификатора

ddvamp
Автор

На 8:30 не понятно почему в третьем примере можно l-value ref присвоить r-value ref. Тут противоречие со вторым примером или опечатка. Объясните?

sogimul
Автор

А фон синий у вас самодельный? Или это скрин гличарта с работы? Ф11))) Очень жду в GCC [](this auto& self, ...){...};

DARTWADER
Автор

Почему-то пропал мой утренний коммент :(

makaedg
Автор

1:02:00 в первом ассёрте наверное мы хотим использовать decltype(expr), а не decltype(id-expr), т.е. вызвать decltype((x))
Похоже на sleeping test

facker