Базовый курс C++ (MIPT, ILab). Lecture 17. Вывод типов и свёртка ссылок.

แชร์
ฝัง
  • เผยแพร่เมื่อ 9 พ.ย. 2024

ความคิดเห็น • 21

  • @pavelrid
    @pavelrid 2 ปีที่แล้ว +4

    Очень интересно, большое спасибо за лекцию! Лекцию придется пересматривать с открытым Godbolt'ом )

  • @АндрейМисюров
    @АндрейМисюров 2 ปีที่แล้ว

    отличная лекция! нашел много ответов на интересующие вопросы. большое спасибо!

  • @nikitayasinskiy7790
    @nikitayasinskiy7790 ปีที่แล้ว

    Спасибо за лекции!
    На 55-м слайде похоже опечатка: decltype(x) && z выведется в int &&, а не в int &.
    То есть данная строчка вообще не скомпилируется.

    • @tilir
      @tilir  ปีที่แล้ว

      да там должно быть decltype(y), тогда сколлапсит в int& z или decltype((x)) с тем же эффектом. Я вероятно забыл поставить лишние скобки.

  • @bitrebus
    @bitrebus ปีที่แล้ว

    32:07 Можно переписать функцию так, чтобы сначала возвращался известный тип:
    auto bad_sum_to(int i) {
    // use after deduction
    if (i

    • @tilir
      @tilir  ปีที่แล้ว

      А можете нарыть в стандарте важен на самом деле этот порядок или нет? Я как ни возьмусь это сделать, меня что-то отвлекает....

    • @bitrebus
      @bitrebus ปีที่แล้ว +1

      @@tilir [dcl.spec.auto.general] #11

  • @p.polunin
    @p.polunin ปีที่แล้ว

    Да, C++ очень точный язык.

  • @ddvamp
    @ddvamp 2 ปีที่แล้ว

    59:41 Но ведь это не так. При типе возврата auto && всё еще есть вывод на основании return stmt, против подстановки для T &&. Но всё равно, здесь это не уместно, так как auto && в любом случае ссылка, и при возврате из fun prvalue произошло бы связывание с временным, и мы получили бы мёртвого попугая.

  • @vlisn
    @vlisn 2 ปีที่แล้ว

    Здравствуйте! На 68-м слайде опечатка в 3-й строке кода: должно ведь быть return fun? Спасибо за знания! :)

    • @tilir
      @tilir  2 ปีที่แล้ว

      Да, действительно опечатка.

  • @niklkelbon3662
    @niklkelbon3662 2 ปีที่แล้ว

    на 36:00 объявление внутри for это конечно потрясающе, но так можно писать только штуки с одинаковыми типами, а значит начиная с С++17 код не рабочий формально(т.к. бегин и енд могут возвращать разные типы)
    Ну и если end() константная операция, то компилятор хочется верить не будет её вызывать каждую итерацию цикла + опять же хочется верить любой адекватный контейнер считает end() быстро и константно(стандартный уж точно)
    P.S. вы кажется функцию забыли форварнуть

    • @tilir
      @tilir  2 ปีที่แล้ว

      Как я понимаю штуки с разными типами тут это ошибка компилятора так что код рабочий если собрался.
      В принципе end() может быть очень тяжёлым. Это для вектора он константный.
      Про форварднуть не понял =) Форвард будет чуть дальше....

    • @niklkelbon3662
      @niklkelbon3662 2 ปีที่แล้ว +1

      @@tilir Да, код рабочий если собрался, но он же может не собраться... А в этом вроде и была идея написания наиболее общего for))
      Про форвард
      template
      decltype(auto) Foo(F&& f, T&& t) {
      return std::forward(f)(std::forward(t);
      }
      Потому что функция передаваемая может быть не копируемой и передаваться как Foo(f, 5) или вообще не копируемой и не мувабл(std::stop_callback), плюс могут быть перегрузки оператора () для & &&

    • @tilir
      @tilir  2 ปีที่แล้ว

      Спасибо, это важное уточнение. Я ещё вернусь к прозрачной оболочке и там в финальной версии постараюсь учесть то что функцию тоже желательно форвардить.

  • @evgeniykochetkov2702
    @evgeniykochetkov2702 ปีที่แล้ว

    на 61 слайде не совсем понятно стало. decltype(auto) tmp=x подписан как "то, что нужно", но tmp же просто как double выводится, а нам 2 раза х не нужен. нам вроде как в скобки х надо брать, тогда получим то что нужно.. или я как то не так понимаю..

  • @mahabat23
    @mahabat23 7 หลายเดือนก่อน

    57:16
    auto&& y = 1u;
    "y" получается "uint ref ref", то есть "rvalue ref"
    но мы ведь договорились в начале курса что "rvalue ref" - это нечто у чего нет имени, а выходит имя есть - "y"
    эта С++ идея пахнет over engineered

    • @tilir
      @tilir  7 หลายเดือนก่อน +1

      Вы мыслите в правильном направлении но слишком рано останавливаетесь ))
      Имени нет у rvalue. Тогда как rvalue ref имеет идентичность и таким образом является lvalue.

    • @mahabat23
      @mahabat23 7 หลายเดือนก่อน

      спасибо за объяснение

  • @ufabiz
    @ufabiz 2 ปีที่แล้ว +1

    1:16:15 Вы напрасно считаете D врагом.
    Он не враг и даже не конкурент C++.
    Это разные языки программирования.
    На самом деле D хорошо дополняет C++ потому что позволяет ценой небольшой потери производительности быстро писать качественный код. С таким же успехом врагом можно считать вообще любой другой язык программирования.
    Я тоже несколько лет назад "уверовал в D" но на C++ меньше писать не стал.
    На D надо смотреть ни как на врага, а как на второй язык программирования.
    Меня больше удивляют плюсовики, которым нравится Пайтон. Пайтон полная противоположность C++.
    В D нет такого же полного контроля, который даёт нам C++, но многие вещи там сделаны великолепно. Мне кажется с D стоит познакомиться просто из уважения к Александреску. В плане метапрограммирования он бесподобен. И вообще многие концепции там сделаны так, как я хотел бы видеть их в C++. Те же рэнжи, контракты, рефлексия.
    Пора прекратить эту бессмысленную вражду и шовинизм. Причем с обеих сторон.

    • @tilir
      @tilir  2 ปีที่แล้ว +2

      Вы преувеличиваете мой негатив в отношении D. Там была мягкая ирония.
      И да, он сейчас никому не конкурент. Примерно по тем же причинам, что Оберон. Там осталось какое то коммьюнити которое держит язык на плаву, но это, в общем, тупик.