auto&& 变量不是右值引用

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 for细节)。关键字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 被命名为右值,被视为左值,因此 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&&