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&&
为什么 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&&