[英]Why does the std::move() work in c++?
以下是代碼段:
int i=0;
int&&k=std::move(i);
在c ++入門中,此舉是
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
是一個左值,我有什么不對嗎?
同樣,我認為第一個代碼片段將被編譯為:
int&& temp=0; int&& k=temp;//oop!temp is an lvalue!
您可能會將類型與值類別混淆。
每個C ++表達式(具有操作數,文字,變量名等的運算符)的特征在於兩個獨立的屬性: 類型和值類別 。
int&&k=std::move(i);
和int&& k=temp;
不一樣。 std::move
的返回類型是rvalue-reference,然后std::move
返回的是一個rvalue(更准確地說它是一個xvalue),它可以綁定到rvalue-reference。 另一方面, temp
是一個命名變量,然后它總是一個左值,無論它的類型是int
, int&
, int&&
等等.Lvalue不能綁定到rvalue-reference。
關於左值的更多信息:
以下表達式是左值表達式:
- 變量的名稱,......
以下表達式是xvalue表達式:
- 函數調用或重載的運算符表達式,其返回類型是對象的右值引用,例如
std::move(x)
;- ...
- 表達式對rvalue對象類型的引用,例如
static_cast<char&&>(x)
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.