完美转发

Posted stephen-qin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完美转发相关的知识,希望对你有一定的参考价值。

完美转发(perfect forwarding)问题是指函数模板在向其他函数传递参数时该如何保留该参数的左右值属性的问题。也就是说函数模板在向其他函数传递自身形参时,如果相应实参是左值,它就应该被转发为左值;同样如果相应实参是右值,它就应该被转发为右值。
 
这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理(比如参数为左值时实施拷贝语义;参数为右值时实施移动语义)的可能性。如果将自身参数不分左右值一律转发为左值,其他函数就只能将转发而来的参数视为左值,从而失去针对该参数的左右值属性进行不同处理的可能性。
 
转发引用是一种特别的引用,它保持函数参数的值类别,令以 std::forward 转发参数可行
 
一个完美转发的例子:

Example:

#include <iostream>  
using namespace std;

void fun(int &x) { cout << "lvalue ref" << endl; }
void fun(int &&x) { cout << "rvalue ref" << endl; }
void fun(const int &x) { cout << "const lvalue ref" << endl; }
void fun(const int &&x) { cout << "const rvalue ref" << endl; }

template<typename T>
void PerfectForward(T &&t)    // 函数模板
{ 
fun(std::forward<T>(t));   //fun是其他函数
}
int main() { PerfectForward(10); // rvalue ref int a; PerfectForward(a); // lvalue ref PerfectForward(std::move(a)); // rvalue ref const int b = 8; PerfectForward(b); // const lvalue ref PerfectForward(std::move(b)); // const rvalue ref getchar(); return 0; }
输出为:

rvalue ref
lvalue ref
rvalue ref
const lvalue ref
const rvalue ref

可以看到,左右值属性完美地保留了。其核心就在std::forward这个模板函数。
 








以上是关于完美转发的主要内容,如果未能解决你的问题,请参考以下文章

C++11完美转发及实现方法详解

C++11完美转发及实现方法详解

C++中的万能引用和完美转发

完美转发

完美转发

在片段着色器中绘制别名像素完美线?