Thank you, Konstantin, for keep teaching us. Please be careful in that tragic time. If you or some other good developers will need to relocate to another country please let me know
25:14 Извините, не понял фразу "чтобы она (Heavy) сбайндилась со ссылкой, на фрейме этой функции должна создаться его копия". По-моему, два копирования возникают, потому что первый раз Heavy копируется при передаче по значению в конструктор StackElem, а второй раз при инициализации elem в конструкторе. Или я не прав?
Прекрсное видео! Но думаю, что нужно исправить ошибку в таблице 57:20, а то получается оператор запятая, а не свёртка)) А именно init OP ... op pack и pack op ... OP fini
25:10 "Должна сбайндится со сссылкой". Ничего подобного, там просто передача по ссылке, двойное копирование - это дальше в передаче в конструктор, а потом инициализация мембера - вот два копирования. Можете проверить, добавив в push лог.
> Впервые познакомили с void_t > Да господи что за фигня, чем она может помочь > Поигрался с void_t и SFINAE > Мало того что понял void_t > Так еще понял и SFINAE Лучше на ютубе, чем лекции Констатина, я не увижу. Сначала не соглашаешься, бьешься головой пытаясь понять ... а потом как проникаешься. И вот интересно, больше таких лекций я не видел. Воистину Физтех могуч
Все ли виды итераторов должны быть copyable? Если да, то правильно ли, что если итератор указывал на какой-то элемент контейнера, то его копия так же обязана указывать на тот же элемент?
Константин, здравствуйте! Подскажите пожалуйста, вопрос немного не в тему ролика, но не знал где лучше спросить. Возможно, Вы видели книгу C++20 - The Complete Guide by Nicolai M. Josuttis. Она еще в процессе написания, но готовность 84% на текущий момент. Как думаете, стоит ее прочесть или что-то другое, возможно, порекомендуете о возможностях 20 стандарта почитать?
Нет, пока не видел. Посоветовать пока тоже нечего. Сейчас люди только потихоньку осознают стандарт. Должно пройти ещё года четыре чтобы накопилось некое критическое понимание. До тех пор лучше ориентироваться на конференции.
@@tilir тут уже есть комментарий про то, что в таблице на 56:50 должен быть init op ... op pack. Ведь у нас top выступает как init. намучался, пытаясь сделать как в таблице. Но я изначально почему-то затупил. адреса взять догадался. а то что к ним доступ через ->*, а не -> уже не вошло в мое сознание(хотя посмотрел лекцию про перегрузку по подсказке).
Подскажите, пожалуйста, как правильнее делать: 1. Последний параметр шаблона через void_t 2. enable_if_t в последнем параметре шаблона 3. Возвращаемый тип через enable_if_t в сигнатуре функции. Или есть ещё методы (приёмы) для SFINAE?
Правильнее для чего? Это разные техники. void_t служит для проверки существования (как квантор всеобщности). enable_if разбирается в лекции по итераторам и служит для проверки условий (и их отображения на существование/несуществование). У обоих есть свои применения. В любом случае портить сигнатуру считается дурным тоном и так делают только от безысходности. А правильно в современном C++ конечно писать requires. До этого мы ещё дойдём.
Thank you, Konstantin, for keep teaching us. Please be careful in that tragic time. If you or some other good developers will need to relocate to another country please let me know
> let me know
you didn't leave any contacts)
@@niklkelbon3662 Leave your LinkedIn link here or I can find you
25:14 Извините, не понял фразу "чтобы она (Heavy) сбайндилась со ссылкой, на фрейме этой функции должна создаться его копия". По-моему, два копирования возникают, потому что первый раз Heavy копируется при передаче по значению в конструктор StackElem, а второй раз при инициализации elem в конструкторе. Или я не прав?
Я то же так считаю
Всё верно, видимо Константин ошибся
1:12:20 В range-based обходе никогда не возвращается первый элемент.
++nelts нужно вынести вниз за break из оператора запятая
Прекрсное видео! Но думаю, что нужно исправить ошибку в таблице 57:20, а то получается оператор запятая, а не свёртка))
А именно init OP ... op pack и pack op ... OP fini
1:12:34 а что если разыменование итератора возвращает &&? Может сделать func(forward(elt)) ?)) А то может там функция принимает && ...?)
Обосновано, но слайды бы замусорило. Я уже показал технику проброса функции в разговоре о прозрачной оболочке, все всё поняли.
24:35 Строка 59 - А по своей сути это разве не push_front?
25:10 "Должна сбайндится со сссылкой". Ничего подобного, там просто передача по ссылке, двойное копирование - это дальше в передаче в конструктор, а потом инициализация мембера - вот два копирования. Можете проверить, добавив в push лог.
+++, оговорился наверное
53:33 очень смешно получилось.
> Впервые познакомили с void_t
> Да господи что за фигня, чем она может помочь
> Поигрался с void_t и SFINAE
> Мало того что понял void_t
> Так еще понял и SFINAE
Лучше на ютубе, чем лекции Констатина, я не увижу. Сначала не соглашаешься, бьешься головой пытаясь понять ... а потом как проникаешься. И вот интересно, больше таких лекций я не видел. Воистину Физтех могуч
Все ли виды итераторов должны быть copyable? Если да, то правильно ли, что если итератор указывал на какой-то элемент контейнера, то его копия так же обязана указывать на тот же элемент?
Да конечно, copyable входит в concept cpp17-iterator, см. [iterator.traits]
Константин, здравствуйте! Подскажите пожалуйста, вопрос немного не в тему ролика, но не знал где лучше спросить. Возможно, Вы видели книгу C++20 - The Complete Guide by Nicolai M. Josuttis. Она еще в процессе написания, но готовность 84% на текущий момент. Как думаете, стоит ее прочесть или что-то другое, возможно, порекомендуете о возможностях 20 стандарта почитать?
Нет, пока не видел. Посоветовать пока тоже нечего. Сейчас люди только потихоньку осознают стандарт. Должно пройти ещё года четыре чтобы накопилось некое критическое понимание. До тех пор лучше ориентироваться на конференции.
1:31:07 В следующей лекции не раскрыт секрет как написать tree_get (видимо студенты справились). Можно узнать как это решается в 1 строчку?
Только хорошо подумайте прежде чем заглядывать в ответ: godbolt.org/z/7qhd5Y3ar
@@tilir А можно как-нибудь взять left не по адресу, а по имени поля, чтобы не прибивать его гвоздями к int?
@@tilir тут уже есть комментарий про то, что в таблице на 56:50 должен быть init op ... op pack. Ведь у нас top выступает как init.
намучался, пытаясь сделать как в таблице. Но я изначально почему-то затупил. адреса взять догадался. а то что к ним доступ через ->*, а не -> уже не вошло в мое сознание(хотя посмотрел лекцию про перегрузку по подсказке).
А как сделать forward declaration, для функции с void_t, поместив в файл .h а реализацию в .hpp?
А в чём проблемы?
Подскажите, пожалуйста, как правильнее делать:
1. Последний параметр шаблона через void_t
2. enable_if_t в последнем параметре шаблона
3. Возвращаемый тип через enable_if_t в сигнатуре функции.
Или есть ещё методы (приёмы) для SFINAE?
Правильнее для чего? Это разные техники. void_t служит для проверки существования (как квантор всеобщности). enable_if разбирается в лекции по итераторам и служит для проверки условий (и их отображения на существование/несуществование). У обоих есть свои применения.
В любом случае портить сигнатуру считается дурным тоном и так делают только от безысходности.
А правильно в современном C++ конечно писать requires. До этого мы ещё дойдём.
1:24:44 Forward итератор так же должен уметь разыменовываться в l-value
Мне кажется это опционально. То есть это возможно но это не требование.
Ясно. Ну главное, что это разрешено реализовывать для forward итератора. А не то, что "forward итератор НЕ должен уметь разыменовываться в l-value".
Привет, подскажите пожалуйста, продублированы ли эти лекции где-то еще? вк, зен итп?
Почитайте вкладку коммьюнити этого канала. Всё есть: и телеграм и дискорд и рутьюб и торренты.
По поводу получения i-го элемента из пачки, можно так?
std::get(make_tuple(args...));
Вполне. Только мы этого ещё не проходили в этот момент =)
Хочется повторить забег но на работе завал. Как всегда на высоте.