1:16:15 Вы напрасно считаете D врагом. Он не враг и даже не конкурент C++. Это разные языки программирования. На самом деле D хорошо дополняет C++ потому что позволяет ценой небольшой потери производительности быстро писать качественный код. С таким же успехом врагом можно считать вообще любой другой язык программирования. Я тоже несколько лет назад "уверовал в D" но на C++ меньше писать не стал. На D надо смотреть ни как на врага, а как на второй язык программирования. Меня больше удивляют плюсовики, которым нравится Пайтон. Пайтон полная противоположность C++. В D нет такого же полного контроля, который даёт нам C++, но многие вещи там сделаны великолепно. Мне кажется с D стоит познакомиться просто из уважения к Александреску. В плане метапрограммирования он бесподобен. И вообще многие концепции там сделаны так, как я хотел бы видеть их в C++. Те же рэнжи, контракты, рефлексия. Пора прекратить эту бессмысленную вражду и шовинизм. Причем с обеих сторон.
Вы преувеличиваете мой негатив в отношении D. Там была мягкая ирония. И да, он сейчас никому не конкурент. Примерно по тем же причинам, что Оберон. Там осталось какое то коммьюнити которое держит язык на плаву, но это, в общем, тупик.
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), плюс могут быть перегрузки оператора () для & &&
Спасибо, это важное уточнение. Я ещё вернусь к прозрачной оболочке и там в финальной версии постараюсь учесть то что функцию тоже желательно форвардить.
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))))?
на 61 слайде не совсем понятно стало. decltype(auto) tmp=x подписан как "то, что нужно", но tmp же просто как double выводится, а нам 2 раза х не нужен. нам вроде как в скобки х надо брать, тогда получим то что нужно.. или я как то не так понимаю..
56:30. 1. Получается ли теперь, что шаблонные функции теперь нужно всегда помечать T&&? 2. А если нешаблонные, то допустимо оставить const type& t? 3. А если v содержит массив указателей, то всё равно писать auto&& ?
57:16 auto&& y = 1u; "y" получается "uint ref ref", то есть "rvalue ref" но мы ведь договорились в начале курса что "rvalue ref" - это нечто у чего нет имени, а выходит имя есть - "y" эта С++ идея пахнет over engineered
Вы мыслите в правильном направлении но слишком рано останавливаетесь )) Имени нет у rvalue. Тогда как rvalue ref имеет идентичность и таким образом является lvalue.
46:10. Здравствуйте. Подскажите, пожалуйста. Почему при изменении любой переменной она влияет на все значения. Что "c, y" ссылаются на x, и при изменении чего-то из этого изменяется все - это понятно. Но почему с auto&& d{ std::move(y) }; тоже работает изменение. Раз 'y' это число, то при вызове move-семантики оно должно скопироваться просто как int, почему получается, что копируется как int&, ввиду чего auto&& d превращается в auto& d? godbolt.org/z/4YG735c78