Почему std::move() работает в C++?

Ниже приведен фрагмент кода:

int i=0;
int&&k=std::move(i);

В праймере с ++ ход

template <typename T>
typename remove_reference<T>::type &&move(T&& t)
{return static_cast<typename remove_reference<T>::type&&>(t);}

Насколько я знаю, это std::move шаблон вычтет функцию как

int&& move(int& t){return static_cast<int&&>(t);}

Для сравнения и уточнения моего вопроса рассмотрим пример, подобный этому:

 int test(int k){k=66;return k;}
 int k;
 int a=test(k);

Код выше будет скомпилирован как:

int temp;//the temporary object
temp=k;
int a=temp;

Точно так же я думаю, что первый фрагмент кода будет скомпилирован как:

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!

что кажется неправильным, потому что temp такое lvalue, я что-то не так понял?

1 ответ

Точно так же я думаю, что первый фрагмент кода будет скомпилирован как:

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!

Возможно, вы путаете тип с категорией значения.

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

int&&k=std::move(i); а также int&& k=temp; не идентичны Тип возврата std::move это Rvalue-ссылка, а затем что std::move return - это rvalue (точнее, xvalue), которое может быть привязано к rvalue-reference. С другой стороны temp является именованной переменной, то это всегда lvalue, независимо от того, является ли ее тип int, int&, int&& и т.д. Lvalue не может быть привязан к rvalue-reference.

Больше информации о lvalue:

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

  • имя переменной,...

и xvalue (rvalue):

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

  • вызов функции или перегруженное выражение оператора, тип возвращаемого значения которого является rvalue ссылкой на объект, такой как std::move(x);
  • ...
  • приведенное выражение для rvalue ссылки на тип объекта, например static_cast<char&&>(x);
Другие вопросы по тегам