Skip to content

Latest commit

 

History

History
34 lines (26 loc) · 1.25 KB

auto&&万能引用和引用折叠.md

File metadata and controls

34 lines (26 loc) · 1.25 KB

下面的例子演示了auto&&如何用于实现通用代码中的类型转发,以及引用折叠是如何发生的:

#include <iostream>
#include <utility>

// 接受左值引用的函数
void process(int& x) {
  std::cout << "process(int&): " << x << std::endl;
}

// 接受右值引用的函数
void process(int&& x) {
  std::cout << "process(int&&): " << x << std::endl;
}

// 接受任意类型的参数
template <typename T>
void forward(T&& x) {
  process(std::forward<T>(x));  // 转发参数到 process 函数
}

int main() {
  int n = 42;
  forward(n);   // 接受左值
  forward(100); // 接受右值
  return 0;
}

在上面的代码中,forward函数使用了auto&&来实现类型转发,将参数x转发给了process函数。由于auto&&的引用折叠特性,当forward函数接受一个左值时,auto&&推导出的类型是左值引用,这样转发的参数就是左值引用;而当forward函数接受一个右值时,auto&&推导出的类型是右值引用,这样转发的参数就是右值引用。

在上面的例子中,当forward函数接受一个左值时,process(int&)会被调用;而当forward函数接受一个右值时,process(int&&)会被调用。这就是引用折叠规则的应用