汽车和放大器;&安培;变量不是右值参考

时间:2016-01-20 12:03:07

标签: c++ c++11 auto forwarding-reference

为何选择汽车&&是不是左值参考?

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

下面是右值参考示例

BASIC

为什么var2不是右值引用,但f和var2是右值引用?

2 个答案:

答案 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&&