c – auto \u0026\u0026 variable不是右值引用
作者:互联网
为什么汽车&&是不是左值参考?
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的类型(有关详细信息,请参阅模板参数推导#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)
因此,汽车&&根据初始化器,可以推导出左值引用或右值引用.
在您的情况下,虚构的模板看起来像
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&&
标签:forwarding-reference,c,c11,auto 来源: https://codeday.me/bug/20190823/1694664.html