右值参考参数变成左值

Sha*_*esh 3 c++ c++11

请考虑以下代码:

class a {
public:
    int a;
};

void func1( a &&var1 );

void func2( a &&var2 )
{
    func1(var2);
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译它时,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 );
      ^
Run Code Online (Sandbox Code Playgroud)

似乎var2是一个左值,尽管它被明确定义为右值引用.一旦分配,双&符号是否会失去意义?在这里工作的机制是什么?

Rub*_*ens 5

在函数实现中,once -rvalue成为一个常规变量(l值),您可以在其中进行赋值.如果要再次将其转换为右值,则必须使用std::move,如:

void func2( a &&var2 ) {
    func1(std::move(var2));
}
Run Code Online (Sandbox Code Playgroud)