右值参考参数变成左值

时间:2014-05-04 17:53:22

标签: c++ c++11

请考虑以下代码:

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是一个左值,尽管它被明确定义为右值引用。一旦分配,双&符号是否会失去意义?在这里工作的机制是什么?

3 个答案:

答案 0 :(得分:5)

在函数实现中,一次 -rvalue成为常规变量(l值),您可以对其进行分配。如果您想再次将其变为右值,则必须使用std::move,如:

void func2( a &&var2 ) {
    func1(std::move(var2));
}

答案 1 :(得分:4)

没有机制在起作用,只有定义。 var2是表示变量的标识符。当用作表达式时,它变为 id-expression ,其值类别定义如下,在5.1.1[expr.prim.general]/8

  

结果是由标识符表示的实体。如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue。

变量

var2具有对a

的类型右值引用

var2表达式的类型为a,值类别为lvalue

(你不是第一个混淆rvalues和rvalue引用的人)

答案 2 :(得分:2)

func2中,理论上你可以写a = <something>。因此a是l值。所以编译器是正确的。