Причина использования std :: move для ссылочного параметра rvalue - PullRequest
4 голосов
/ 08 ноября 2019

Я читал книгу о структуре данных, реализованной в C ++, я не понимаю фрагмент кода , это часть векторного класса

void push_back(object &&x) {
        //do something
        objects[size++] = std::move(x);
    }

Я знаю, что std::move возвращает ссылку на значение объекта,но функция-член push_back уже имеет в качестве параметра ссылку rvalue x, здесь std::move здесь не нужноиспользовать std::move на своем члене, если мы хотим вызвать перемещение вместо копирования, верно? как код ниже:

A& operator=(A&& other) {
     member = std::move(other.member);
     return *this;
}

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

не является ли это стандартным: переместить сюда ненужно?

Нет. Типы и значения категорий - это разные вещи.

(выделено мной)

Каждое выражение C ++ (оператор с его операндами, литерал, имя переменной,и т. д.) характеризуется двумя независимыми свойствами: тип и категория значения .

Следующие выражения являются выражениями lvalue:

имя переменной, функции, объекта параметра шаблона (начиная с C ++ 20) или члена данных, независимо от типа, такого как std :: cin или std :: endl. Даже если тип переменной является ссылкой на rvalue, выражение, состоящее из ее имени, является выражением lvalue ;

std::move преобразует lvalue в rvalue (xvalue). В качестве именованной переменной x является lvalue, std::move преобразует его в rvalue в objects[size++] = std::move(x);, тогда предполагается использование оператора присваивания перемещения. В противном случае вместо этого будет использоваться оператор присваивания копии;lvalue не может быть привязан к ссылке на rvalue.

нам все еще нужно использовать std :: move для его члена, если мы хотим вызвать move вместо copy right?

Да, та же причина, что и выше.

3 голосов
/ 08 ноября 2019

x имеет имя, поэтому это lvalue внутри функции. Ссылка rvalue была привязана к lvalue x. std::move возвращает его к переданному значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...