1、简介
完美转发是在函数函数模版或类模版中将参数原样的转发给另一个函数或者类模版,原样转发主要是指参数的左值和右值属性。
左值是可以取地址、具有持久性的对象,右值指不能取地址、临时生成的对象。
std::forawrd是C++11引入的函数模版,用于函数模版和模版类中,实现完美转发。
#include <iostream>
using namespace std;
void func(int& i)
{
cout << "lvalue\n";
}
void func(int&& i)
{
cout << "rvalue\n";
}
int main()
{
func(1);
int x = 1;
func(x);
return 0;
}
//输出:
//rvalue
//lvalue
上述例子中,x为左值,1为右值。
2、std::forward完美转发原理
//vs2019源码
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(
remove_reference_t<_Ty>& _Arg) noexcept { // forward an lvalue as either an lvalue or an rvalue
return static_cast<_Ty&&>(_Arg);
}
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
return static_cast<_Ty&&>(_Arg);
}
#include <iostream>
using namespace std;
void func(int& i)
{
cout << "lvalue\n";
}
void func(int&& i)
{
cout << "rvalue\n";
}
template<typename T>
void func1(T&& t)
{
func(std::forward<T>(t));
}
int main()
{
func1(1);
int x = 1;
func1(x);
return 0;
}
//输出:
//rvalue
//lvalue