我在理解右值引用的工作方式时遇到麻烦。我有以下代码:
void f(int&& i)
{}
int main()
{
int i = 42;
int&& r = std::move(i);
f(r);
return 0;
}
这里,出现以下编译器错误:
prog.cpp: In function ‘int main()’:
prog.cpp:46:7: error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’
f(r);
^
prog.cpp:38:6: note: initializing argument 1 of ‘void f(int&&)’
void f(int&& i)
^
为什么当我明确声明r
为右值引用时,编译器为什么认为我正在传递左值?进行f(std::move(r))
似乎可行,但我仍然不明白那里有什么不同。
这是因为在f(r)
调用中,r
被视为左值吗?如果是这样,std::move(r)
是什么类型?
类型和value categories是不同的东西。
每个C ++表达式(具有其操作数,文字,变量名等的运算符)的特征在于两个独立的属性:类型和值类别。
作为命名变量,r
是一个左值,不能绑定到右值引用。
(重点是我的)
以下表达式是左值表达式:
- 变量的名称,函数,模板参数对象(自C ++ 20起)或数据成员,无论类型如何,例如std :: cin或std :: endl。 即使变量的类型是右值引用,由名称组成的表达式是左值表达式;