Тёмный
No video :(

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

Konstantin Vladimirov
Подписаться 21 тыс.
Просмотров 10 тыс.
50% 1

Опубликовано:

 

29 авг 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 27   
@pavelrid
@pavelrid 2 года назад
Очень интересно, большое спасибо за лекцию! Лекцию придется пересматривать с открытым Godbolt'ом )
@user-uc7og5gt3q
@user-uc7og5gt3q 2 года назад
отличная лекция! нашел много ответов на интересующие вопросы. большое спасибо!
@bitrebus
@bitrebus Год назад
32:07 Можно переписать функцию так, чтобы сначала возвращался известный тип: auto bad_sum_to(int i) { // use after deduction if (i
@tilir
@tilir Год назад
А можете нарыть в стандарте важен на самом деле этот порядок или нет? Я как ни возьмусь это сделать, меня что-то отвлекает....
@bitrebus
@bitrebus Год назад
@@tilir [dcl.spec.auto.general] #11
@nikitayasinskiy7790
@nikitayasinskiy7790 Год назад
Спасибо за лекции! На 55-м слайде похоже опечатка: decltype(x) && z выведется в int &&, а не в int &. То есть данная строчка вообще не скомпилируется.
@tilir
@tilir Год назад
да там должно быть decltype(y), тогда сколлапсит в int& z или decltype((x)) с тем же эффектом. Я вероятно забыл поставить лишние скобки.
@ufabiz
@ufabiz 2 года назад
1:16:15 Вы напрасно считаете D врагом. Он не враг и даже не конкурент C++. Это разные языки программирования. На самом деле D хорошо дополняет C++ потому что позволяет ценой небольшой потери производительности быстро писать качественный код. С таким же успехом врагом можно считать вообще любой другой язык программирования. Я тоже несколько лет назад "уверовал в D" но на C++ меньше писать не стал. На D надо смотреть ни как на врага, а как на второй язык программирования. Меня больше удивляют плюсовики, которым нравится Пайтон. Пайтон полная противоположность C++. В D нет такого же полного контроля, который даёт нам C++, но многие вещи там сделаны великолепно. Мне кажется с D стоит познакомиться просто из уважения к Александреску. В плане метапрограммирования он бесподобен. И вообще многие концепции там сделаны так, как я хотел бы видеть их в C++. Те же рэнжи, контракты, рефлексия. Пора прекратить эту бессмысленную вражду и шовинизм. Причем с обеих сторон.
@tilir
@tilir 2 года назад
Вы преувеличиваете мой негатив в отношении D. Там была мягкая ирония. И да, он сейчас никому не конкурент. Примерно по тем же причинам, что Оберон. Там осталось какое то коммьюнити которое держит язык на плаву, но это, в общем, тупик.
@p.polunin
@p.polunin Год назад
Да, C++ очень точный язык.
@ddvamp
@ddvamp Год назад
59:41 Но ведь это не так. При типе возврата auto && всё еще есть вывод на основании return stmt, против подстановки для T &&. Но всё равно, здесь это не уместно, так как auto && в любом случае ссылка, и при возврате из fun prvalue произошло бы связывание с временным, и мы получили бы мёртвого попугая.
@niklkelbon3662
@niklkelbon3662 2 года назад
на 36:00 объявление внутри for это конечно потрясающе, но так можно писать только штуки с одинаковыми типами, а значит начиная с С++17 код не рабочий формально(т.к. бегин и енд могут возвращать разные типы) Ну и если end() константная операция, то компилятор хочется верить не будет её вызывать каждую итерацию цикла + опять же хочется верить любой адекватный контейнер считает end() быстро и константно(стандартный уж точно) P.S. вы кажется функцию забыли форварнуть
@tilir
@tilir 2 года назад
Как я понимаю штуки с разными типами тут это ошибка компилятора так что код рабочий если собрался. В принципе end() может быть очень тяжёлым. Это для вектора он константный. Про форварднуть не понял =) Форвард будет чуть дальше....
@niklkelbon3662
@niklkelbon3662 2 года назад
@@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 года назад
Спасибо, это важное уточнение. Я ещё вернусь к прозрачной оболочке и там в финальной версии постараюсь учесть то что функцию тоже желательно форвардить.
@dmitrydemis8981
@dmitrydemis8981 8 месяцев назад
01:04:45. всегда ли получается, что если есть const ref, то rvalue всё равно будет копироваться? 01:05:40. 1. А в чём будет проблема, если бы мы написали fun(std::move(arg)); Ведь в std::swap же используется std::move что на Lvalue, что на Rvalue? 2. Или добавили бы std::move(foo(std::move(x))))?
@tilir
@tilir 8 месяцев назад
Вы досматривайте лекцию прежде чем вопросы писать в комментариях.
@evgeniykochetkov2702
@evgeniykochetkov2702 Год назад
на 61 слайде не совсем понятно стало. decltype(auto) tmp=x подписан как "то, что нужно", но tmp же просто как double выводится, а нам 2 раза х не нужен. нам вроде как в скобки х надо брать, тогда получим то что нужно.. или я как то не так понимаю..
@dmitrydemis8981
@dmitrydemis8981 8 месяцев назад
56:30. 1. Получается ли теперь, что шаблонные функции теперь нужно всегда помечать T&&? 2. А если нешаблонные, то допустимо оставить const type& t? 3. А если v содержит массив указателей, то всё равно писать auto&& ?
@tilir
@tilir 8 месяцев назад
Нет по всем пунктам. Не все, не всегда, а только если вам нужно поведение а-ля форвардинг. Не надо делать гайдлайны на пустом месте.
@mahabat23
@mahabat23 5 месяцев назад
57:16 auto&& y = 1u; "y" получается "uint ref ref", то есть "rvalue ref" но мы ведь договорились в начале курса что "rvalue ref" - это нечто у чего нет имени, а выходит имя есть - "y" эта С++ идея пахнет over engineered
@tilir
@tilir 5 месяцев назад
Вы мыслите в правильном направлении но слишком рано останавливаетесь )) Имени нет у rvalue. Тогда как rvalue ref имеет идентичность и таким образом является lvalue.
@mahabat23
@mahabat23 5 месяцев назад
спасибо за объяснение
@vlisn
@vlisn 2 года назад
Здравствуйте! На 68-м слайде опечатка в 3-й строке кода: должно ведь быть return fun? Спасибо за знания! :)
@tilir
@tilir 2 года назад
Да, действительно опечатка.
@dmitrydemis8981
@dmitrydemis8981 8 месяцев назад
46:10. Здравствуйте. Подскажите, пожалуйста. Почему при изменении любой переменной она влияет на все значения. Что "c, y" ссылаются на x, и при изменении чего-то из этого изменяется все - это понятно. Но почему с auto&& d{ std::move(y) }; тоже работает изменение. Раз 'y' это число, то при вызове move-семантики оно должно скопироваться просто как int, почему получается, что копируется как int&, ввиду чего auto&& d превращается в auto& d? godbolt.org/z/4YG735c78
@tilir
@tilir 8 месяцев назад
Нет просто делается && которая связана со значением конкретной lvalue.
Далее
Oh No! My Doll Fell In The Dirt🤧💩
00:17
Просмотров 12 млн
Голливудский конвейер звёзд
29:20
КАК УСТРОЕН TCP/IP?
31:32
Просмотров 57 тыс.
Clang internals (in Russian)
1:44:14
Просмотров 6 тыс.