理解这个完美的转发例子

Understading this perfect forwarding example

本文关键字:转发 完美      更新时间:2023-10-16

我在试图理解std::forward做什么时遇到了以下示例

// forward example
#include <utility>      // std::forward
#include <iostream>     // std::cout
// function with lvalue and rvalue reference overloads:
void overloaded (const int& x) {std::cout << "[lvalue]";}
void overloaded (int&& x) {std::cout << "[rvalue]";}
// function template taking rvalue reference to deduced type:
template <class T> void fn (T&& x) {
  overloaded (x);                   // always an lvalue
  overloaded (std::forward<T>(x));  // rvalue if argument is rvalue
}
int main () {
  std::cout << "calling fn with rvalue: ";
  fn (0);
  std::cout << 'n';
  return 0;
}

程序输出为

用rvalue调用fn: [lvalue][rvalue]

现在我的问题是我们是如何先得到lvalue的?这是我的思路在main中,我称之为fn(0);,现在0是右值。因此,通用参考x被推导为如下

void fn (int&& && x);

根据引用坍缩我们会得到

void fn (int&& x);

使得x表现得像右值。因此,如果传递了x,则应该调用右值重载方法。然而,似乎调用了另一个重载左值引用函数。如果有人能澄清一下,我将不胜感激

命名的变量绝不是右值。它总是一个左值。右值只是没有名称的表达式。

int && i = int(0);

这里的表达式int(0)是一个右值,但是变量i本身是一个左值,声明绑定到一个右值