Задать вопрос

Чем rvalue-ссылка отличается от lvalue-ссылки?

Добрый день. Если я не ошибаюсь, то lvalue-ссылка &r может ссылаться на адрес памяти именованного объекта (переменной). Так вот, rvalue-ссылка &&rr это тоже самое что и lvalue-ссылка, только при этом может ссылаться на временный объект? (например литерал 5)

показываю на примере то что они похожи:
int x = 5;
int &r = x; //lvalue-ссылка
r = 10;
cout <<  x; //в консоли: 10

//другой пример:
int x = 5;
int &&rr = move(x); //rvalue-ссылка
rr = 10;
cout <<  x; //в консоли: 10


показываю на примере что может ссылаться на временный объект:
int x = 5;
inr &r = x; //work
int &r = 10; //nope

int &&rr = x; //nope
int &&rr = move(x); //work
int &&rr = 10; //work


Кто нибудь может пояснить? Если они почти одинаково работают, то в чем профит использования rvalue ссылок в семантике перемещения. Тема для меня очень сложная. Не могу понять концепцию..
  • Вопрос задан
  • 1591 просмотр
Подписаться 7 Оценить Комментировать
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
то в чем профит использования rvalue ссылок в семантике перемещения

В том, что они позволяют отличить временные объекты, из которых можно утащить кое-что полезное, от постоянных, с которыми так лучше не поступать. Постоянные объекты будут и дальше копироваться конструкторами копирования. А вот для временных будет выбран конструктор перемещения, если таковой определен.

Использование std::move - это возможность назвать некоторый постоянный с точки зрения языка объект (например, обыкновенную локальную переменную) временным, когда есть уверенность, что его содержимое не нужно далее по коду. Для него все также будет вызван деструктор (т.е. объект, попавший под move-семантику НЕ считается разрушенным после этого), но после процедуры перемещения считается, что объект находится в некотором неопределенном ("пустом"), но валидном состоянии.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Вы можете реализовать класс таким образом. Суть в том что при перемещении вам не надо лишний раз выделять память и копировать данные, а достаточно позаимствовать указатель (объект временный). Для того чтобы компилятор знал какой конструктор использовать нужна rvalue семантика.
Код очень схематичный.

class A
{
private:
  char* ptr;
  int size;
public:
  A(char* initial){/*allocate etc*/}
  ~A(){/*deallocate etc*/}

//конструктор копирования
  A(const A& other) { 
    size = other.size;
    ptr = new char[size]; 
    memcpy(ptr, other.ptr, size ); }

//конструктор перемещения
  A(A&& other) {
    size = other.size;
    ptr = other.ptr;

    other.size = 0;
    other.ptr = nullptr; }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Подробное описание: https://habrahabr.ru/post/226229/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы