Ниже приведен фрагмент кода:
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, я что-то не так понял?
Точно так же я думаю, что первый фрагмент кода будет скомпилирован как:
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)
;
Других решений пока нет …