59:41 Но ведь это не так. При типе возврата auto && всё еще есть вывод на основании return stmt, против подстановки для T &&. Но всё равно, здесь это не уместно, так как auto && в любом случае ссылка, и при возврате из fun prvalue произошло бы связывание с временным, и мы получили бы мёртвого попугая.
на 36:00 объявление внутри for это конечно потрясающе, но так можно писать только штуки с одинаковыми типами, а значит начиная с С++17 код не рабочий формально(т.к. бегин и енд могут возвращать разные типы) Ну и если end() константная операция, то компилятор хочется верить не будет её вызывать каждую итерацию цикла + опять же хочется верить любой адекватный контейнер считает end() быстро и константно(стандартный уж точно) P.S. вы кажется функцию забыли форварнуть
Как я понимаю штуки с разными типами тут это ошибка компилятора так что код рабочий если собрался. В принципе end() может быть очень тяжёлым. Это для вектора он константный. Про форварднуть не понял =) Форвард будет чуть дальше....
@@tilir Да, код рабочий если собрался, но он же может не собраться... А в этом вроде и была идея написания наиболее общего for)) Про форвард template decltype(auto) Foo(F&& f, T&& t) { return std::forward(f)(std::forward(t); } Потому что функция передаваемая может быть не копируемой и передаваться как Foo(f, 5) или вообще не копируемой и не мувабл(std::stop_callback), плюс могут быть перегрузки оператора () для & &&
Спасибо, это важное уточнение. Я ещё вернусь к прозрачной оболочке и там в финальной версии постараюсь учесть то что функцию тоже желательно форвардить.
на 61 слайде не совсем понятно стало. decltype(auto) tmp=x подписан как "то, что нужно", но tmp же просто как double выводится, а нам 2 раза х не нужен. нам вроде как в скобки х надо брать, тогда получим то что нужно.. или я как то не так понимаю..
57:16 auto&& y = 1u; "y" получается "uint ref ref", то есть "rvalue ref" но мы ведь договорились в начале курса что "rvalue ref" - это нечто у чего нет имени, а выходит имя есть - "y" эта С++ идея пахнет over engineered
Вы мыслите в правильном направлении но слишком рано останавливаетесь )) Имени нет у rvalue. Тогда как rvalue ref имеет идентичность и таким образом является lvalue.
1:16:15 Вы напрасно считаете D врагом. Он не враг и даже не конкурент C++. Это разные языки программирования. На самом деле D хорошо дополняет C++ потому что позволяет ценой небольшой потери производительности быстро писать качественный код. С таким же успехом врагом можно считать вообще любой другой язык программирования. Я тоже несколько лет назад "уверовал в D" но на C++ меньше писать не стал. На D надо смотреть ни как на врага, а как на второй язык программирования. Меня больше удивляют плюсовики, которым нравится Пайтон. Пайтон полная противоположность C++. В D нет такого же полного контроля, который даёт нам C++, но многие вещи там сделаны великолепно. Мне кажется с D стоит познакомиться просто из уважения к Александреску. В плане метапрограммирования он бесподобен. И вообще многие концепции там сделаны так, как я хотел бы видеть их в C++. Те же рэнжи, контракты, рефлексия. Пора прекратить эту бессмысленную вражду и шовинизм. Причем с обеих сторон.
Вы преувеличиваете мой негатив в отношении D. Там была мягкая ирония. И да, он сейчас никому не конкурент. Примерно по тем же причинам, что Оберон. Там осталось какое то коммьюнити которое держит язык на плаву, но это, в общем, тупик.
Очень интересно, большое спасибо за лекцию! Лекцию придется пересматривать с открытым Godbolt'ом )
отличная лекция! нашел много ответов на интересующие вопросы. большое спасибо!
Спасибо за лекции!
На 55-м слайде похоже опечатка: decltype(x) && z выведется в int &&, а не в int &.
То есть данная строчка вообще не скомпилируется.
да там должно быть decltype(y), тогда сколлапсит в int& z или decltype((x)) с тем же эффектом. Я вероятно забыл поставить лишние скобки.
32:07 Можно переписать функцию так, чтобы сначала возвращался известный тип:
auto bad_sum_to(int i) {
// use after deduction
if (i
А можете нарыть в стандарте важен на самом деле этот порядок или нет? Я как ни возьмусь это сделать, меня что-то отвлекает....
@@tilir [dcl.spec.auto.general] #11
Да, C++ очень точный язык.
59:41 Но ведь это не так. При типе возврата auto && всё еще есть вывод на основании return stmt, против подстановки для T &&. Но всё равно, здесь это не уместно, так как auto && в любом случае ссылка, и при возврате из fun prvalue произошло бы связывание с временным, и мы получили бы мёртвого попугая.
Здравствуйте! На 68-м слайде опечатка в 3-й строке кода: должно ведь быть return fun? Спасибо за знания! :)
Да, действительно опечатка.
на 36:00 объявление внутри for это конечно потрясающе, но так можно писать только штуки с одинаковыми типами, а значит начиная с С++17 код не рабочий формально(т.к. бегин и енд могут возвращать разные типы)
Ну и если end() константная операция, то компилятор хочется верить не будет её вызывать каждую итерацию цикла + опять же хочется верить любой адекватный контейнер считает end() быстро и константно(стандартный уж точно)
P.S. вы кажется функцию забыли форварнуть
Как я понимаю штуки с разными типами тут это ошибка компилятора так что код рабочий если собрался.
В принципе end() может быть очень тяжёлым. Это для вектора он константный.
Про форварднуть не понял =) Форвард будет чуть дальше....
@@tilir Да, код рабочий если собрался, но он же может не собраться... А в этом вроде и была идея написания наиболее общего for))
Про форвард
template
decltype(auto) Foo(F&& f, T&& t) {
return std::forward(f)(std::forward(t);
}
Потому что функция передаваемая может быть не копируемой и передаваться как Foo(f, 5) или вообще не копируемой и не мувабл(std::stop_callback), плюс могут быть перегрузки оператора () для & &&
Спасибо, это важное уточнение. Я ещё вернусь к прозрачной оболочке и там в финальной версии постараюсь учесть то что функцию тоже желательно форвардить.
на 61 слайде не совсем понятно стало. decltype(auto) tmp=x подписан как "то, что нужно", но tmp же просто как double выводится, а нам 2 раза х не нужен. нам вроде как в скобки х надо брать, тогда получим то что нужно.. или я как то не так понимаю..
57:16
auto&& y = 1u;
"y" получается "uint ref ref", то есть "rvalue ref"
но мы ведь договорились в начале курса что "rvalue ref" - это нечто у чего нет имени, а выходит имя есть - "y"
эта С++ идея пахнет over engineered
Вы мыслите в правильном направлении но слишком рано останавливаетесь ))
Имени нет у rvalue. Тогда как rvalue ref имеет идентичность и таким образом является lvalue.
спасибо за объяснение
1:16:15 Вы напрасно считаете D врагом.
Он не враг и даже не конкурент C++.
Это разные языки программирования.
На самом деле D хорошо дополняет C++ потому что позволяет ценой небольшой потери производительности быстро писать качественный код. С таким же успехом врагом можно считать вообще любой другой язык программирования.
Я тоже несколько лет назад "уверовал в D" но на C++ меньше писать не стал.
На D надо смотреть ни как на врага, а как на второй язык программирования.
Меня больше удивляют плюсовики, которым нравится Пайтон. Пайтон полная противоположность C++.
В D нет такого же полного контроля, который даёт нам C++, но многие вещи там сделаны великолепно. Мне кажется с D стоит познакомиться просто из уважения к Александреску. В плане метапрограммирования он бесподобен. И вообще многие концепции там сделаны так, как я хотел бы видеть их в C++. Те же рэнжи, контракты, рефлексия.
Пора прекратить эту бессмысленную вражду и шовинизм. Причем с обеих сторон.
Вы преувеличиваете мой негатив в отношении D. Там была мягкая ирония.
И да, он сейчас никому не конкурент. Примерно по тем же причинам, что Оберон. Там осталось какое то коммьюнити которое держит язык на плаву, но это, в общем, тупик.