完美转发std::forward

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值