[C++11] rvalue и lvalue ссылки, идеальная передача
HTML-код
- Опубликовано: 7 дек 2016
- В этом видео вы узнаете:
1) Что такое левосторонние и правосторонние выражения
2) Для чего нужны rvalue и lvalue ссылки
3) Где и когда используется "идеальная передача" и чем она отличается от передачи аргументов по стандарту ниже C++11.
Файлы этого урока на GitHub: i2m.su/jLOgeY
Задавайте Ваши вопросы:
Я в VK - id297086696
Я в FB - i2m.su/klotNf
Group VK - codrob
Group FB - i2m.su/xRPlWf
Спасибо за урок! Очень понятно и круто объясняешь
музыку бы убрать, а так - супер!
Чётко! Спасибо за видео 😃👍
Как всегда топ.
С++ рулит!!!!
Огромное спасибо😊
Сначала ничего не понял, но увидев яндекс браузер все стало понятно
Если из getStr сделать return str; то сработает RVO. Зачем в примере из функции возвращается ссылка?
Урок хороший, но есть ошибка.
T&& - называется универсальной ссылкой, может принимать как rvalue, так и lvalue значения.
int&& - это уже rvalue ссылка.
да, но только в случае, если T является шаблонным параметром
сегодня сообщество приняло называть подобные ссылки forwarding references, вместо предложенного Майерсом обозначения universal reference,
потому что они пробрасывают (forward) аргумент, сохраняя value category выражения :)
@@killkill7180 а можно по подробнее?) пожалуйста
@@oleslav07 en.cppreference.com/w/cpp/language/reference#Forwarding_references
Вот этот момент относительно std::move(a) остался мною не понят.
1. переменная 'а' имеет выделенную память, после move эта память все еще закреплена за 'a', и более того, как показал дебаг, она не очищается как сказано в видео.
2. переменная tmp тоже должна иметь выделенную память.
Итог: память потребляется все еще для 3-х переменных.
Вопрос: так в чем фишка move?
Ну прежде всего стоит знать что в дебаг режиме мало что очищается(в целях дебага очевидно) поэтому делать такие выводы - бессмысленно.
вам надо более подробно ознакомится с перемещением .
@@excore1322 Бред
А как оч большие данные могут быть правосторонними? Ведь все они по сути задаются в Редакторе.. Только если большой Char*, но и тут был выход - выделить заранее динамически строку и передать(причем сделать это можно один раз). Просто для удобства?
сhar* по определению не может быть большим. Под большими данными имеется ввиду инфа из базы или просто какой нибуть большой бинарник... Тот же файл фильма.
Вы пишете: *Ведь все они по сути задаются в Редакторе* Бред.
Разве когда мы будем возражать строку не отработает конструктор копирования
Не понятна разница с использованием && + muve в функцию , и использовать просто передачу по ссылке , как было в примере , если мы используем параметр функции как сылку , то мы не можем передать в неё аргумент 5 , но мы можем его присвоить переменной и передать по ссылке , и это будет не копирование. Пока что не понят , какую проблему решает перемещение по сравнению с передачей по ссылке
Смысл в том, что у вас есть возможность реализовать перегрузку функции для lvalue и для rvalue. А это означает, что вы можете различать какой объект к вам прислали: обычный объект, или временный. Если прислали временный, то его можно смело ограбить. Например:
String(const String& rhs) { deepCopy(rhs); } //
если передать в функцию print константное значение "a", оно поменяеться? Если подумать логично то да, но все же хочу быть уверенным
Вы пишете: *Если подумать логично то да* Вы осознаете, что считаете логичным *изменение неизменяемого объекта* ?
@@princessmary5556 6 лет прошло. Стыдно что я смотрел русского чувака. Возможно сейчас он русский террорист. Зашквар
@@bodiart4259 Вы не ответили на мой вопрос. А что вам там стыдно - не интересует.
@@princessmary5556 какой серьйозный. Как хорошо, что всем все-равно что тебя интересует, Если ты русский - иди нахуй. Осознаю ли я что считаю логичным изменение неизменяемого оьекта? 6 лет прошло, я начинал учить программирование. Абсолютно без разницы. Сейчас больше осознание какие русские ублюдки. Желаю как можно быстрей осознать какие вы далбоебы. Интересуйся своей страной и то что вы натворили.
@@bodiart4259 Мнение дебила-русофоба не интересует.
Музыка заглушает речь!
Она здесь лишняя.
Когда ты уже из армии вернешься
int a=10;
int b=100;
a=a+b;
b=a-b;
a=a-b;
;) spasibo za xaroshie video
а теперь с бинарником в 1гб тоже самое сделай)
Обменяй таким способом 2.000.000.000 и 2.000.000.001
в целом понятно, но разве не проще менять указатели, а не сами объекты?
если я не ошибаюсь, ты сам об этом говорилв одном из прошлых видео
Проще. Но rvalue придуманы для иных случаев, смотри внимательней) Когда у тебя есть метод, который работает с большим объектом и он возвращает тебе ССЫЛКУ на этот объект, но эта ссылка ведет на ЛОКАЛЬНЫЙ объект, а т.к. нельзя возвратить ссылку на локальный объект - будет произведено копирование этого объекта при передаче в новый метод (print) и чтобы избежать такого копирования используют &&.
Спамибо, понял
@@efremov_engineer Бред.
А если передать туда указатель? Разве произойдет копирование?
Только начала просмотр, а уже музыка душит и отвлекает(
вообще-то rvalue и lvalue это сокращение от read value и locale value,а не left и right.
Откуда вы такое взяли? *(new int(3)) - lvalue, хотя переменная нифига не локальная
rigth value и left value. "правостоящее значение" и "левостоящее значение" Названия выражений отражают типичное использование выражений. Однако в действительности могут быть ситуации, когда правостороннее выражение может быть и слева, а левостороннее выражение может быть справа.
@@viktor_borodin Просто выдумал чушь.
Музыка все портит
Очень пространно объясняешь. Не приводишь аргументов. Почему? Ответ - потому. Хреновое объснение. Сам толком не понимаешь походу.