理解这个完美的转发示例

时间:2014-05-12 04:00:09

标签: 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 << "[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的行为与rvalue相同。如果传递x,则应调用rvalue重载方法。但是,似乎调用了另一个重载的左值引用函数。如果有人能澄清这个,我将不胜感激

1 个答案:

答案 0 :(得分:3)

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

int && i = int(0);

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