Эх, мне бы эту лекцию пару недель назад! Столкнулся на работе с задачей форварда аргументов в лямбду. В итоге дошёл до std::apply с лямбдой и раскрытием пачки, но пришлось конкретно так поковыряться) Большое спасибо, что выкладываете!
1:08:10 Константин, возможно вы видели, есть пропосал нового statement в язык для итерирования по tuple-like объектам (а также объектам классов) в compile-time: P1306R2 Expansion statements P.S. Немного пробежавшись глазами по документу, я увидел, что ведутся обсуждения по добавлению в язык возможности итерироваться по пачкам, что довольно круто. Но всё же, через pack indexing можно было бы задать индексы, которые я хочу пробежать
Нет не видел. Заглянул. Интересно (ну по автору понятно что будет интересно, Вандерворд всё таки), но я невысоко оцениваю шансы таких предложений пройти.
1:18:50 - в простейшем случае эту технику(пусть даже и как "сахарок" для удобства) можно использовать, например, для описания переходов конечного автомата, где состояния - типы variant'а. Иногда эту идею развивают и делают FSM более системной: CppCon 2018: Mateusz Pusz “Effective replacement of dynamic polymorphism with std::variant”.
Относительно примера на 53:00: то есть, a=[]{} и b=[]{} это два разных типа и объекта лямбды, но, если два раза вернуть []{} из функции, мы получим один и тот же объект лямбды?
12:25 Константин, что именно вы подразумеваете под Callable? Стандарт однозначно задаёт function object type [function.objects] и callable type [function.objects#func.def-3]. P.S. Минорно, но к function object type (слайд 5) ещё относятся ссылка на функцию, а также класс с приведением к ссылке на функцию или к ссылке на указатель на функцию
Я в данном случае несколько неформален, поскольку настоящий callable с моей точки зрения это не callable type из стандарта, а просто всё что пролазит в invoke. Что гораздо шире.
Всем привет! На 16:07 в функции print_range параметр e форвардится так : std::forward(e). Разве не нужно добавить std::decay std::forward< std::decay_t< delctype(e) > >( e ) ? Ведь е может оказаться ссылочной переменной
Почему msvc не компилятор? В силы его некросплатформенности и closed sourse или у него есть ещё какие-то недостатки? Кстати спасибо за лекцию, на одном дыхании смотрю ваши лекции вместо аниме и сериалов)
Вполне себе компилятор. Ну да, со своими проблемами и странностями. Я иногда позволяю себе некие полемические перехлёсты, особенно в магистерском курсе т.к. магистранты -- люди взрослые и понимающие.
1:06:25 Константин, "This parrot is no more!". forward_as_tuple пораждает набор (!) ссылок, что противоречит исходной задаче: передать xvalue по значению. Поэтому, при передаче в foo prvalue, лямбда переживёт их. Пример: #include #include struct Parrot { ~Parrot() { std::cout
У меня в примере никто ничего не переживает: godbolt.org/z/osWYMcrar Ваша проблема что у вас Parrot{} это временный объект который живёт до конца полного выражения. Он должен был умереть, он и умер. Фокус заключался в пробросе с сохранением семантики а не в пробросе с продлением времени жизни.
Касательно правила на 47:50. А что на счёт константного локального нестатического контекста? MSVC, например, не обязывает захватывать в лямбду локальные константные и constexpr переменные.
спасибо большое за лекцию, как всегда узнал много нового! хотел подметить, что вы становитесь хороши в кликбейте - превьюшка, где вы хватаетесь за голову, сильно подогревает интерес к видео :)
Кстати, на 25 слайде порядок вызова вычислений не гарантирован, и не факт что будет 21,52,74,106. Прямое копирование слейда у меня дало 106,85,54,32. Это на mingw GCC 6.3 с -std=c++17 .
Омерзительный он (если бы в языке он был) потому что нелогичный. У вас там уточнённый вывод типов в силу auto&. Зачем туда ещё дописывать const, напишите его справа. Я главное совершенно не помню где я увидел и почему решил, что такое в языке есть. Проверил дома -- разумеется такого нет.
Эх, мне бы эту лекцию пару недель назад! Столкнулся на работе с задачей форварда аргументов в лямбду. В итоге дошёл до std::apply с лямбдой и раскрытием пачки, но пришлось конкретно так поковыряться)
Большое спасибо, что выкладываете!
1:08:10 Константин, возможно вы видели, есть пропосал нового statement в язык для итерирования по tuple-like объектам (а также объектам классов) в compile-time: P1306R2 Expansion statements
P.S. Немного пробежавшись глазами по документу, я увидел, что ведутся обсуждения по добавлению в язык возможности итерироваться по пачкам, что довольно круто. Но всё же, через pack indexing можно было бы задать индексы, которые я хочу пробежать
Нет не видел. Заглянул. Интересно (ну по автору понятно что будет интересно, Вандерворд всё таки), но я невысоко оцениваю шансы таких предложений пройти.
1:18:50 - в простейшем случае эту технику(пусть даже и как "сахарок" для удобства) можно использовать, например, для описания переходов конечного автомата, где состояния - типы variant'а.
Иногда эту идею развивают и делают FSM более системной: CppCon 2018: Mateusz Pusz “Effective replacement of dynamic polymorphism with std::variant”.
Относительно примера на 53:00: то есть, a=[]{} и b=[]{} это два разных типа и объекта лямбды, но, если два раза вернуть []{} из функции, мы получим один и тот же объект лямбды?
12:25 Константин, что именно вы подразумеваете под Callable? Стандарт однозначно задаёт function object type [function.objects] и callable type [function.objects#func.def-3].
P.S. Минорно, но к function object type (слайд 5) ещё относятся ссылка на функцию, а также класс с приведением к ссылке на функцию или к ссылке на указатель на функцию
Я в данном случае несколько неформален, поскольку настоящий callable с моей точки зрения это не callable type из стандарта, а просто всё что пролазит в invoke. Что гораздо шире.
10 слайд прекрасен
Всем привет! На 16:07 в функции print_range параметр e форвардится так : std::forward(e). Разве не нужно добавить std::decay std::forward< std::decay_t< delctype(e) > >( e ) ? Ведь е может оказаться ссылочной переменной
Я проговаривал в этом курсе что буду такое опускать (и иногда даже опускаю forward и т.п.) ради понятности кода на слайдах. А так-то да, конечно.
Почему msvc не компилятор? В силы его некросплатформенности и closed sourse или у него есть ещё какие-то недостатки?
Кстати спасибо за лекцию, на одном дыхании смотрю ваши лекции вместо аниме и сериалов)
Вполне себе компилятор. Ну да, со своими проблемами и странностями.
Я иногда позволяю себе некие полемические перехлёсты, особенно в магистерском курсе т.к. магистранты -- люди взрослые и понимающие.
1:06:25 Константин, "This parrot is no more!". forward_as_tuple пораждает набор (!) ссылок, что противоречит исходной задаче: передать xvalue по значению. Поэтому, при передаче в foo prvalue, лямбда переживёт их. Пример:
#include
#include
struct Parrot {
~Parrot() { std::cout
У меня в примере никто ничего не переживает: godbolt.org/z/osWYMcrar
Ваша проблема что у вас Parrot{} это временный объект который живёт до конца полного выражения. Он должен был умереть, он и умер. Фокус заключался в пробросе с сохранением семантики а не в пробросе с продлением времени жизни.
@@tilir Я говорил про строку 11 (auto f1 = foo(1);). В ней 1 точно так же материализуется во временный объект, который уже мёртв в строке 12
Касательно правила на 47:50. А что на счёт константного локального нестатического контекста? MSVC, например, не обязывает захватывать в лямбду локальные константные и constexpr переменные.
А какая разница на бытовом уровне? Если вы всё равно не можете это поменять то для вас что оно захватилось что нет....
спасибо большое за лекцию, как всегда узнал много нового!
хотел подметить, что вы становитесь хороши в кликбейте - превьюшка, где вы хватаетесь за голову, сильно подогревает интерес к видео :)
Справедливости ради: я пока что всегда ставлю на превью только те кадры, которые в видео фактически присутствуют.
Интересно было бы послушать про суть техники стирания типов, как она под капотом работает. Может быть есть/планируется лекция по этому вопросу?
Да в этом же курсе про динамический полиморфизм.
@@tilir отлично, спасибо)
Подскажите, пожалуйста, по 60 слайду: self же выведения в лямбду, которая принимает Node*, а мы хотим, чтобы в visit передавался весь overload
Кстати, на 25 слайде порядок вызова вычислений не гарантирован, и не факт что будет 21,52,74,106. Прямое копирование слейда у меня дало 106,85,54,32. Это на mingw GCC 6.3 с -std=c++17 .
Гарантирован с C++17 и далее
Разве на слайде 37 не нужно писать std::forward_as_tuple(std::forward(a)...)? Или это было ощущено для красоты слайда?
Да я в лекции явно говорю что форварды по мелочи расставляйте в уме самостоятельно ))
30:05 Объясните, все же, почему этот способ омерзителен? Чем способ с переименованием [&r = std::as_const(a)] лучше?
Омерзительный он (если бы в языке он был) потому что нелогичный. У вас там уточнённый вывод типов в силу auto&. Зачем туда ещё дописывать const, напишите его справа.
Я главное совершенно не помню где я увидел и почему решил, что такое в языке есть. Проверил дома -- разумеется такого нет.
Можно ли получить доступ к домашним заданиям?
В магистерском курсе только одна курсовая работа. Детали я поместил в лекцию #4 про ODR, в конец.
30:08 а как? 🤔
clang 14 конструкции вида [const &x] и [& const x] не компилирует
Хм. Видимо к счастью никак. Хорошо что не вынес на слайды.