[英]rvalue reference argument turning into an lvalue
请考虑以下代码:
class a {
public:
int a;
};
void func1( a &&var1 );
void func2( a &&var2 )
{
func1(var2);
}
在尝试编译它时,gcc返回以下内容:
question.cpp: In function ‘void func2(a&&)’:
question.cpp:10:14: error: cannot bind ‘a’ lvalue to ‘a&&’
func1(var);
^
question.cpp:6:6: error: initializing argument 1 of ‘void func1(a&&)’
void func1( a &&var );
^
似乎var2是一个左值,尽管它被明确定义为右值引用。 一旦分配,双&符号是否会失去意义? 在这里工作的机制是什么?
在函数实现中, once -rvalue成为一个常规变量(l值),您可以在其中进行赋值。 如果要再次将其转换为右值,则必须使用std::move
,如下所示:
void func2( a &&var2 ) {
func1(std::move(var2));
}
没有机制在起作用,只有定义。 var2
是表示变量的标识符。 当用作表达式时,它变为id-expression ,其值类别定义如下,在5.1.1[expr.prim.general]/8
结果是由标识符表示的实体。 如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue。
变量var2
具有对a
类型rvalue引用
var2
,表达式,具有类型a
和值类别lvalue
(你不是第一个混淆rvalues和rvalue引用的人)
在func2
,理论上你可以写a = <something>
。 因此a
是l值。 所以编译器是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.