[英]What does auto&& do?
這是Scott Meyers撰寫的C ++ 11 Notes Sample中的代碼,
int x;
auto&& a1 = x; // x is lvalue, so type of a1 is int&
auto&& a2 = std::move(x); // std::move(x) is rvalue, so type of a2 is int&&
我在理解auto&&
時遇到了麻煩。
我對auto
有一些了解,從中我可以說auto& a1 = x
應該將a1
類型設為int&
從引用的代碼來看,似乎是錯誤的。
我寫了這個小代碼,並在gcc下運行。
#include <iostream>
using namespace std;
int main()
{
int x = 4;
auto& a1 = x; //line 8
cout << a1 << endl;
++a1;
cout << x;
return 0;
}
輸出= 4 (newline) 5
然后我將第8行修改為auto&& a1 = x;
,然后跑了。 輸出相同。
我的問題: auto&
等於auto&&
嗎?
如果它們不同, auto&&
做什么?
該代碼是正確的。 auto&& p = expr
裝置的類型p
是T&&
其中T
將從推斷expr
。 此處的&&
表示右值引用,例如
auto&& p = 1;
將推斷T == int
,因此p
的類型為int&&
。
但是,可以根據以下規則折疊引用:
T& & == T&
T& && == T&
T&& & == T&
T&& && == T&&
(此功能用於在C ++ 11中實現完美的轉發。)
在這種情況下
auto&& p = x;
因為x
是左值,所以不能將右值引用綁定到它,但是如果我們推斷T = int&
則p
的類型將成為int& && = int&
,這是一個左值引用,可以綁定到x
。 僅在這種情況下, auto&&
和auto&
給出相同的結果。 但這兩個是不同的,例如
auto& p = std::move(x);
是不正確的,因為std::move(x)
是一個右值,並且左值引用無法綁定到它。
請閱讀解釋的C ++ Rvalue參考 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.