[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

Комментарии • 53

  • @Mrpoljkee
    @Mrpoljkee 6 лет назад +3

    Спасибо за урок! Очень понятно и круто объясняешь

  • @JoffreyB
    @JoffreyB 6 лет назад +13

    музыку бы убрать, а так - супер!

  • @KIR_Engineer
    @KIR_Engineer 2 года назад

    Чётко! Спасибо за видео 😃👍

  • @cppprograms5868
    @cppprograms5868 3 года назад

    Как всегда топ.
    С++ рулит!!!!

  • @oleslav07
    @oleslav07 3 года назад

    Огромное спасибо😊

  • @MEPTPAH
    @MEPTPAH 5 лет назад +2

    Сначала ничего не понял, но увидев яндекс браузер все стало понятно

  • @kipitix
    @kipitix 5 лет назад +2

    Если из getStr сделать return str; то сработает RVO. Зачем в примере из функции возвращается ссылка?

  • @XxVxVxNxX
    @XxVxVxNxX 7 лет назад +15

    Урок хороший, но есть ошибка.
    T&& - называется универсальной ссылкой, может принимать как rvalue, так и lvalue значения.
    int&& - это уже rvalue ссылка.

    • @killkill7180
      @killkill7180 5 лет назад

      да, но только в случае, если T является шаблонным параметром
      сегодня сообщество приняло называть подобные ссылки forwarding references, вместо предложенного Майерсом обозначения universal reference,
      потому что они пробрасывают (forward) аргумент, сохраняя value category выражения :)

    • @oleslav07
      @oleslav07 3 года назад

      @@killkill7180 а можно по подробнее?) пожалуйста

    • @killkill7180
      @killkill7180 3 года назад

      @@oleslav07 en.cppreference.com/w/cpp/language/reference#Forwarding_references

  • @margopril605
    @margopril605 6 лет назад +1

    Вот этот момент относительно std::move(a) остался мною не понят.
    1. переменная 'а' имеет выделенную память, после move эта память все еще закреплена за 'a', и более того, как показал дебаг, она не очищается как сказано в видео.
    2. переменная tmp тоже должна иметь выделенную память.
    Итог: память потребляется все еще для 3-х переменных.
    Вопрос: так в чем фишка move?

    • @excore1322
      @excore1322 5 лет назад

      Ну прежде всего стоит знать что в дебаг режиме мало что очищается(в целях дебага очевидно) поэтому делать такие выводы - бессмысленно.

    • @cppprograms5868
      @cppprograms5868 3 года назад

      вам надо более подробно ознакомится с перемещением .

    • @princessmary5556
      @princessmary5556 Год назад

      @@excore1322 Бред

  • @anadre86
    @anadre86 7 лет назад

    А как оч большие данные могут быть правосторонними? Ведь все они по сути задаются в Редакторе.. Только если большой Char*, но и тут был выход - выделить заранее динамически строку и передать(причем сделать это можно один раз). Просто для удобства?

    • @rtm8718
      @rtm8718 7 лет назад

      сhar* по определению не может быть большим. Под большими данными имеется ввиду инфа из базы или просто какой нибуть большой бинарник... Тот же файл фильма.

    • @princessmary5556
      @princessmary5556 Год назад

      Вы пишете: *Ведь все они по сути задаются в Редакторе* Бред.

  • @JohnWickMovie
    @JohnWickMovie 6 лет назад

    Разве когда мы будем возражать строку не отработает конструктор копирования

  • @it-coding
    @it-coding 2 года назад

    Не понятна разница с использованием && + muve в функцию , и использовать просто передачу по ссылке , как было в примере , если мы используем параметр функции как сылку , то мы не можем передать в неё аргумент 5 , но мы можем его присвоить переменной и передать по ссылке , и это будет не копирование. Пока что не понят , какую проблему решает перемещение по сравнению с передачей по ссылке

    • @princessmary5556
      @princessmary5556 Год назад

      Смысл в том, что у вас есть возможность реализовать перегрузку функции для lvalue и для rvalue. А это означает, что вы можете различать какой объект к вам прислали: обычный объект, или временный. Если прислали временный, то его можно смело ограбить. Например:
      String(const String& rhs) { deepCopy(rhs); } //

  • @bodiart4259
    @bodiart4259 7 лет назад

    если передать в функцию print константное значение "a", оно поменяеться? Если подумать логично то да, но все же хочу быть уверенным

    • @princessmary5556
      @princessmary5556 Год назад

      Вы пишете: *Если подумать логично то да* Вы осознаете, что считаете логичным *изменение неизменяемого объекта* ?

    • @bodiart4259
      @bodiart4259 Год назад

      @@princessmary5556 6 лет прошло. Стыдно что я смотрел русского чувака. Возможно сейчас он русский террорист. Зашквар

    • @princessmary5556
      @princessmary5556 Год назад

      @@bodiart4259 Вы не ответили на мой вопрос. А что вам там стыдно - не интересует.

    • @bodiart4259
      @bodiart4259 Год назад

      @@princessmary5556 какой серьйозный. Как хорошо, что всем все-равно что тебя интересует, Если ты русский - иди нахуй. Осознаю ли я что считаю логичным изменение неизменяемого оьекта? 6 лет прошло, я начинал учить программирование. Абсолютно без разницы. Сейчас больше осознание какие русские ублюдки. Желаю как можно быстрей осознать какие вы далбоебы. Интересуйся своей страной и то что вы натворили.

    • @princessmary5556
      @princessmary5556 Год назад

      @@bodiart4259 Мнение дебила-русофоба не интересует.

  • @igordernovoy4093
    @igordernovoy4093 4 года назад +3

    Музыка заглушает речь!
    Она здесь лишняя.

  • @user-mf3cb1vh6r
    @user-mf3cb1vh6r 7 лет назад +7

    Когда ты уже из армии вернешься

  • @shavarshshahoyan
    @shavarshshahoyan 7 лет назад +1

    int a=10;
    int b=100;
    a=a+b;
    b=a-b;
    a=a-b;
    ;) spasibo za xaroshie video

    • @rtm8718
      @rtm8718 7 лет назад

      а теперь с бинарником в 1гб тоже самое сделай)

    • @dimakoltun2739
      @dimakoltun2739 5 лет назад

      Обменяй таким способом 2.000.000.000 и 2.000.000.001

  • @dboryn5361
    @dboryn5361 7 лет назад

    в целом понятно, но разве не проще менять указатели, а не сами объекты?

    • @dboryn5361
      @dboryn5361 7 лет назад

      если я не ошибаюсь, ты сам об этом говорилв одном из прошлых видео

    • @efremov_engineer
      @efremov_engineer  7 лет назад +2

      Проще. Но rvalue придуманы для иных случаев, смотри внимательней) Когда у тебя есть метод, который работает с большим объектом и он возвращает тебе ССЫЛКУ на этот объект, но эта ссылка ведет на ЛОКАЛЬНЫЙ объект, а т.к. нельзя возвратить ссылку на локальный объект - будет произведено копирование этого объекта при передаче в новый метод (print) и чтобы избежать такого копирования используют &&.

    • @dboryn5361
      @dboryn5361 7 лет назад

      Спамибо, понял

    • @princessmary5556
      @princessmary5556 Год назад +1

      @@efremov_engineer Бред.

  • @daniilk4994
    @daniilk4994 11 месяцев назад

    А если передать туда указатель? Разве произойдет копирование?

  • @user-qz1sq1br9v
    @user-qz1sq1br9v Год назад

    Только начала просмотр, а уже музыка душит и отвлекает(

  • @anatolik.6063
    @anatolik.6063 6 лет назад +3

    вообще-то rvalue и lvalue это сокращение от read value и locale value,а не left и right.

    • @viktor_borodin
      @viktor_borodin 3 года назад

      Откуда вы такое взяли? *(new int(3)) - lvalue, хотя переменная нифига не локальная

    • @princessmary5556
      @princessmary5556 Год назад

      rigth value и left value. "правостоящее значение" и "левостоящее значение" Названия выражений отражают типичное использование выражений. Однако в действительности могут быть ситуации, когда правостороннее выражение может быть и слева, а левостороннее выражение может быть справа.

    • @princessmary5556
      @princessmary5556 Год назад

      @@viktor_borodin Просто выдумал чушь.

  • @Azeklir
    @Azeklir 2 месяца назад

    Музыка все портит

  • @apelsin3001
    @apelsin3001 2 года назад

    Очень пространно объясняешь. Не приводишь аргументов. Почему? Ответ - потому. Хреновое объснение. Сам толком не понимаешь походу.