繁体   English   中英

普通右值引用和std :: forward返回的引用之间有什么区别?

[英]What's the difference between an ordinary rvalue reference and one returned by std::forward?

我不能这样做:

int &&q = 7;
int &&r = q; 
//Error Message:
//cannot convert from 'int' to 'int &&'
//You cannot bind an lvalue to an rvalue reference

如果我理解正确,在初始化右值引用时,也会初始化一个临时变量。 所以int &&q = 7; 可以认为是:

int temp = 7;
int &&q = temp;

当在右侧使用参考时,我实际上是在使用裁判。 所以int &&r = q; 可以认为是:

int &&r = temp;  //bind an lvalue to an rvalue reference, cause error, understandable

所以上面是我理解编译器错误发生的方式。


为什么添加std::forward可以解决这个问题?

int &&q = 7;
int &&r = std::forward<int>(q);

我知道std::forward总是返回右值的参考,如何参考由归国std::forward来自不同int&&q

std::forward返回的引用与int&&q不同之处是什么?

他们的价值观类别不同。 请注意,类型和值类别是不同的东西。

q是一个命名变量,它被限定为左值 ,因此它不能绑定到右值引用。

(强调我的)

变量的名称,函数,模板参数对象(自C ++ 20以来)或数据成员,无论类型如何,例如std::cinstd::endl 即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;

虽然从函数返回的rvalue引用被限定为xvalue ,它属于rvalue

函数调用或重载的运算符表达式,其返回类型是对象的右值引用,例如std::move(x) ;

表达式qstd::forward<int>(q)之间的区别在于前者是左值,而后者是左值(基本类别xvalue)。

我在这个答案中解决了类似的问题:关键是q作为一个表达式是一个左值 ,因为它有一个名字。 std::forward<int>(q) (或等价的std::move(q) )是没有名称的表达式,因为它们返回(未命名的)右值引用,它们是xvalues,它是一个子类别rvalue因此可以绑定到右值引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM