簡體   English   中英

auto && variable不是右值引用

[英]auto&& variable's are not rvalue reference

為什么auto &&不是右值參考?

Widget&& var1 = Widget(); // rvalue reference
auto&& var2 = var1; //var2 not rvalue reference

下面是右值參考示例

void f(Widget&& param); // rvalue reference
Widget&& var1 = Widget(); // rvalue reference

為什么var2不是右值參考,而f和var2是右值參考?

auto&&是聲明等同於轉發引用(具有相同的扣除規則)。 因此,當初始化器是左值時,它將被推導為左值參考。 但是, var是一個左值(因為它是一個變量的名稱),因此var2是一個左值引用。

一旦確定了初始化程序的類型,編譯器就會使用函數調用中的模板參數推導規則來確定將替換關鍵字auto的類型(有關詳細信息,請參閱模板參數推導#Other contexts)。 關鍵字auto可以附帶修飾符,例如const& ,它們將參與類型推導。

例如,給定

const auto& i = expr;

i的類型正是虛構中的參數u的類型

template template<class U> 
void f(const U& u)

如果編譯函數調用f(expr)

一般來說,可以如下思考。

 template template<class U> 
    void f(paramtype u)

因此,根據初始化程序, auto&&可以推導為左值引用或右值引用。

在您的情況下,虛構的模板看起來像

 template template<class U> 
        void f(U&& var2){}
f(var1) 

這里, var1被命名為rvalue,它被視為左值,因此var2將被推導為左值。

請考慮以下示例:

auto&& var2 = widget() ; //var2 is rvalue reference here .
int x=10;
const int cx=10;
auto&& uref1 = x; // x is int and lvalue, so uref1's type is int&
auto&& uref2 = cx; // cx is const int and lvalue,  so uref2's type is const int&
auto&& uref3 = 27; // 27 is int and rvalue,  so uref3's type is int&&

暫無
暫無

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

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