Магистерский курс C++ (МФТИ, 2022-2023). Лекция 13. Лямбды.

Поділитися
Вставка
  • Опубліковано 17 лис 2024

КОМЕНТАРІ • 35

  • @makaedg
    @makaedg Рік тому +3

    Эх, мне бы эту лекцию пару недель назад! Столкнулся на работе с задачей форварда аргументов в лямбду. В итоге дошёл до std::apply с лямбдой и раскрытием пачки, но пришлось конкретно так поковыряться)
    Большое спасибо, что выкладываете!

  • @ddvamp
    @ddvamp 5 місяців тому

    1:08:10 Константин, возможно вы видели, есть пропосал нового statement в язык для итерирования по tuple-like объектам (а также объектам классов) в compile-time: P1306R2 Expansion statements
    P.S. Немного пробежавшись глазами по документу, я увидел, что ведутся обсуждения по добавлению в язык возможности итерироваться по пачкам, что довольно круто. Но всё же, через pack indexing можно было бы задать индексы, которые я хочу пробежать

    • @tilir
      @tilir  4 місяці тому

      Нет не видел. Заглянул. Интересно (ну по автору понятно что будет интересно, Вандерворд всё таки), но я невысоко оцениваю шансы таких предложений пройти.

  • @allcreater_
    @allcreater_ Рік тому +1

    1:18:50 - в простейшем случае эту технику(пусть даже и как "сахарок" для удобства) можно использовать, например, для описания переходов конечного автомата, где состояния - типы variant'а.
    Иногда эту идею развивают и делают FSM более системной: CppCon 2018: Mateusz Pusz “Effective replacement of dynamic polymorphism with std::variant”.

  • @DanielPinchuk
    @DanielPinchuk 3 місяці тому

    Относительно примера на 53:00: то есть, a=[]{} и b=[]{} это два разных типа и объекта лямбды, но, если два раза вернуть []{} из функции, мы получим один и тот же объект лямбды?

  • @ddvamp
    @ddvamp 5 місяців тому

    12:25 Константин, что именно вы подразумеваете под Callable? Стандарт однозначно задаёт function object type [function.objects] и callable type [function.objects#func.def-3].
    P.S. Минорно, но к function object type (слайд 5) ещё относятся ссылка на функцию, а также класс с приведением к ссылке на функцию или к ссылке на указатель на функцию

    • @tilir
      @tilir  4 місяці тому

      Я в данном случае несколько неформален, поскольку настоящий callable с моей точки зрения это не callable type из стандарта, а просто всё что пролазит в invoke. Что гораздо шире.

  • @DrUlrih
    @DrUlrih Рік тому

    10 слайд прекрасен

  • @anatarev
    @anatarev Рік тому

    Всем привет! На 16:07 в функции print_range параметр e форвардится так : std::forward(e). Разве не нужно добавить std::decay std::forward< std::decay_t< delctype(e) > >( e ) ? Ведь е может оказаться ссылочной переменной

    • @tilir
      @tilir  11 місяців тому +1

      Я проговаривал в этом курсе что буду такое опускать (и иногда даже опускаю forward и т.п.) ради понятности кода на слайдах. А так-то да, конечно.

  • @sempaidebil8532
    @sempaidebil8532 3 місяці тому

    Почему msvc не компилятор? В силы его некросплатформенности и closed sourse или у него есть ещё какие-то недостатки?
    Кстати спасибо за лекцию, на одном дыхании смотрю ваши лекции вместо аниме и сериалов)

    • @tilir
      @tilir  3 місяці тому +1

      Вполне себе компилятор. Ну да, со своими проблемами и странностями.
      Я иногда позволяю себе некие полемические перехлёсты, особенно в магистерском курсе т.к. магистранты -- люди взрослые и понимающие.

  • @ddvamp
    @ddvamp 5 місяців тому

    1:06:25 Константин, "This parrot is no more!". forward_as_tuple пораждает набор (!) ссылок, что противоречит исходной задаче: передать xvalue по значению. Поэтому, при передаче в foo prvalue, лямбда переживёт их. Пример:
    #include
    #include
    struct Parrot {
    ~Parrot() { std::cout

    • @tilir
      @tilir  4 місяці тому

      У меня в примере никто ничего не переживает: godbolt.org/z/osWYMcrar
      Ваша проблема что у вас Parrot{} это временный объект который живёт до конца полного выражения. Он должен был умереть, он и умер. Фокус заключался в пробросе с сохранением семантики а не в пробросе с продлением времени жизни.

    • @ddvamp
      @ddvamp 4 місяці тому

      @@tilir Я говорил про строку 11 (auto f1 = foo(1);). В ней 1 точно так же материализуется во временный объект, который уже мёртв в строке 12

  • @danielkeehl7450
    @danielkeehl7450 11 місяців тому

    Касательно правила на 47:50. А что на счёт константного локального нестатического контекста? MSVC, например, не обязывает захватывать в лямбду локальные константные и constexpr переменные.

    • @tilir
      @tilir  11 місяців тому +1

      А какая разница на бытовом уровне? Если вы всё равно не можете это поменять то для вас что оно захватилось что нет....

  • @sigasigasiga
    @sigasigasiga Рік тому +6

    спасибо большое за лекцию, как всегда узнал много нового!
    хотел подметить, что вы становитесь хороши в кликбейте - превьюшка, где вы хватаетесь за голову, сильно подогревает интерес к видео :)

    • @tilir
      @tilir  Рік тому +1

      Справедливости ради: я пока что всегда ставлю на превью только те кадры, которые в видео фактически присутствуют.

  • @danielkeehl7450
    @danielkeehl7450 11 місяців тому

    Интересно было бы послушать про суть техники стирания типов, как она под капотом работает. Может быть есть/планируется лекция по этому вопросу?

    • @tilir
      @tilir  11 місяців тому +1

      Да в этом же курсе про динамический полиморфизм.

    • @danielkeehl7450
      @danielkeehl7450 11 місяців тому

      @@tilir отлично, спасибо)

  • @VisibleToAllYTUsers
    @VisibleToAllYTUsers Рік тому

    Подскажите, пожалуйста, по 60 слайду: self же выведения в лямбду, которая принимает Node*, а мы хотим, чтобы в visit передавался весь overload

  • @DrUlrih
    @DrUlrih Рік тому

    Кстати, на 25 слайде порядок вызова вычислений не гарантирован, и не факт что будет 21,52,74,106. Прямое копирование слейда у меня дало 106,85,54,32. Это на mingw GCC 6.3 с -std=c++17 .

    • @tilir
      @tilir  Рік тому

      Гарантирован с C++17 и далее

  • @АндрейШерстобитов-в8д

    Разве на слайде 37 не нужно писать std::forward_as_tuple(std::forward(a)...)? Или это было ощущено для красоты слайда?

    • @tilir
      @tilir  Рік тому +1

      Да я в лекции явно говорю что форварды по мелочи расставляйте в уме самостоятельно ))

  • @d7d1cd
    @d7d1cd Рік тому

    30:05 Объясните, все же, почему этот способ омерзителен? Чем способ с переименованием [&r = std::as_const(a)] лучше?

    • @tilir
      @tilir  Рік тому +2

      Омерзительный он (если бы в языке он был) потому что нелогичный. У вас там уточнённый вывод типов в силу auto&. Зачем туда ещё дописывать const, напишите его справа.
      Я главное совершенно не помню где я увидел и почему решил, что такое в языке есть. Проверил дома -- разумеется такого нет.

  • @illiapechonkin31
    @illiapechonkin31 Рік тому

    Можно ли получить доступ к домашним заданиям?

    • @tilir
      @tilir  Рік тому

      В магистерском курсе только одна курсовая работа. Детали я поместил в лекцию #4 про ODR, в конец.

  • @sigasigasiga
    @sigasigasiga Рік тому +1

    30:08 а как? 🤔
    clang 14 конструкции вида [const &x] и [& const x] не компилирует

    • @tilir
      @tilir  Рік тому

      Хм. Видимо к счастью никак. Хорошо что не вынес на слайды.