5

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;
}

程序的输出是

用右值调用 fn:[左值][右值]

现在我的问题是我们是如何获得lvalue第一的?这是我在main我称为fn(0);Now 0 is rvalue 中的思路。因此,通用参考 x 被推导出为以下

void fn (int&& && x);

现在根据参考折叠我们会得到

void fn (int&& x);

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

4

1 回答 1

3

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

int && i = int(0);

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

于 2014-05-12T04:33:15.693 回答