【问题标题】:Understading this perfect forwarding example了解这个完美的转发示例
【发布时间】:2014-05-12 04:00:09
【问题描述】:

我在尝试了解 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); 现在0 是右值。所以通用引用x推导出如下

void fn (int&& && x);

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

void fn (int&& x);

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

【问题讨论】:

  • x 本身就是一个左值。 x = 2; 完全合法。你不能用右值做到这一点。

标签: c++ perfect-forwarding


【解决方案1】:

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

int && i = int(0);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多