[英]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.