请考虑以下代码:
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是一个左值,尽管它被明确定义为右值引用。一旦分配,双&符号是否会失去意义?在这里工作的机制是什么?
答案 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值。所以编译器是正确的。