簡體   English   中英

右引用混淆傳遞的c ++函數

[英]c++ function that pass by right reference confusion

我在看std :: move函數的源代碼。 它的作用是刪除引用並添加正確的引用(&&)。

/**
*  @brief  Convert a value to an rvalue.
*  @param  __t  A thing of arbitrary type.
*  @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
  constexpr typename std::remove_reference<_Tp>::type&&
  move(_Tp&& __t) noexcept
  { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

因此,我想知道是否可以做出正確的引用並將其傳遞給函數? 因此,這里是:

void f1(int&&) { std::cout << 1; }
void f1(int&) { std::cout << 2; }

int main() {

  int&& x = 1;
  f1(static_cast<decltype(x)>(x));
  f1(static_cast<int&&>(x));
  f1(x);
}

並且,輸出:112

我發現x是int &&的類型,因為前兩個f1做相同的事情。 但是,第三個呢? 它不是int &&嗎? 為什么我必須要static_cast才能將其用作正確的參考? 我知道“ c ++模板完整指南”中有一個蛤lam:

移動語義不會自動傳遞的事實是有意且重要的。 如果不是這樣,那么當我們在函數中第一次使用可移動對象時,它將失去它的值。

我仍然很好奇為什么即使它們具有相同的類型,它們在編譯時也會選擇不同的功能?

您混淆類型和值類別 ,它們是不同的東西。

作為命名變量, x的值類別為lvalue,(其類型為int&& 。)lvalues可以綁定到lvalue-reference,但不能綁定到rvalue-reference。 因此給定f1(x); ,將選擇f1(int&)

要調用f1(int&&) ,您需要將其轉換為rvalue。 第一個和第二個選擇f1(int&&)因為顯式轉換生成右值表達式(更確切地說是右值表達式); 可以綁定到右值引用。 而且std::move以類似的方式工作。

以下表達式是xvalue表達式:

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

暫無
暫無

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

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