簡體   English   中英

auto &&做什么?

[英]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裝置的類型pT&&其中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.

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