C++ 理解这个完美的转发示例

C++ 理解这个完美的转发示例,c++,perfect-forwarding,C++,Perfect Forwarding,我在试图理解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 <<

我在试图理解
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;
}
现在根据参考崩溃,我们将得到

void fn (int&& x);
因此,使
x
的行为类似于右值。因此,如果传递
x
,则应调用右值重载方法。然而,似乎调用了另一个重载的左值引用函数。如果有人能澄清这一点,我将不胜感激。命名变量永远不是右值。它总是一个左值。右值只是没有名称的纯表达式

int && i = int(0);

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

x
本身是一个左值<编码>x=2是完全合法的。你不能用右值。
int && i = int(0);