簡體   English   中英

為什么std :: move()在c ++中工作?

[英]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是一個命名變量,然后它總是一個左值,無論它的類型是intint&int&&等等.Lvalue不能綁定到rvalue-reference。

關於左值的更多信息:

以下表達式是左值表達式:

  • 變量的名稱,......

xvalue(rvalue)

以下表達式是xvalue表達式:

  • 函數調用或重載的運算符表達式,其返回類型是對象的右值引用,例如std::move(x) ;
  • ...
  • 表達式對rvalue對象類型的引用,例如static_cast<char&&>(x) ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM