C ++-将右值引用传递给函数?

问题描述 投票:1回答:1

我在理解右值引用的工作方式时遇到麻烦。我有以下代码:

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)是什么类型?

c++
1个回答
2
投票

类型和value categories是不同的东西。

每个C ++表达式(具有其操作数,文字,变量名等的运算符)的特征在于两个独立的属性:类型和值类别。

作为命名变量,r是一个左值,不能绑定到右值引用。

(重点是我的)

以下表达式是左值表达式:

  • 变量的名称,函数,模板参数对象(自C ++ 20起)或数据成员,无论类型如何,例如std :: cin或std :: endl。 即使变量的类型是右值引用,由名称组成的表达式是左值表达式;
© www.soinside.com 2019 - 2024. All rights reserved.