Почему 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 ссылкой на объект, такой как
std::move(x)
;- ...
- приведенное выражение для rvalue ссылки на тип объекта, например
static_cast<char&&>(x)
;