繁体   English   中英

右值参考参数变成左值

[英]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.

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