c ++ 11 — Почему 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, я что-то не так понял?

6

Решение

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

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:

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

а также xvalue (Rvalue):

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]