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

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

程序的输出是

calling fn with rvalue: [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 本身是一个左值,声明为绑定(bind)到一个右值。

关于c++ - 理解这个完美的转发示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600843/

相关文章:

c++ - 具有仅 header 实现的重复符号

c++ - 大整数类的位操作?

c++ - 我想完善除特定类型之外的前向可变参数

android - 获取 AIMAGE_FORMAT_JPEG 图像失败

多个字符串的 C++ 笛卡尔积

c++ - 在完美转发中 `decltype(std::forward<Args>(args))...` 和 Args&& 有什么区别

c++ - 如何存储通用引用

c++ - 为什么右值引用会被通用引用变成左值引用

c++ - 在静态常量成员数组中将 char 类型转换为字符串

c++ - 完美转发和 std::tuple(或其他模板类)