为何选择汽车&&是不是左值参考?
void f(Widget&& param); // rvalue reference
Widget&& var1 = Widget(); // rvalue reference
下面是右值参考示例
BASIC
为什么var2不是右值引用,但f和var2是右值引用?
答案 0 :(得分:5)
auto&&
是一个声明等同于转发引用(具有相同的扣除规则)。因此,当初始化器是左值时,它将被推导为左值参考。但是,var
是左值(因为它是变量的名称),因此var2
是左值引用。
答案 1 :(得分:2)
一旦确定了初始化程序的类型,编译器就会使用函数调用中的模板参数推导规则来确定将替换关键字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&&