【C++11】完美转发 std::forward()

 引用型别未定义

        用模板时,一下这种传参左值引用、右值引用、常引用都可以调用:

template<class T>
void func(T&& x)
{
    print(x);
}
int main()
{
    int a = 10;
    const int b = 10;
    func(a);
    func(b);
    func(10);
}

其中:

a传入时:T为int&类型,x为int&类型

b传入时:T为const int&类型,x为const int&类型;

10传入时:T为int类型,x为int&&类型


完美转发 

        首先看一个不完美的转发:下面的代码间接传递参数,其中右值引用通过func后有了名字 x ,之后被当作左值引用传给print。

void funa(int && a){}

void print(int& x)
{
	cout << "左值引用" << endl;
}
void print(const int& x)
{
	cout << "常性左值引用" << endl;
}
void print(int&& x)
{
	cout << "右值引用" << endl;
}

template<class T>
void func(T&& x)
{
	print(x);
}
int main()
{
	int a = 10;
	const int b = 20;
	func(a);
	func(30);//30在func中有名字了:a,从右值变成左值
	return 0;
}

 当通过完美转发std::forward<T>(x),就可以避免右值在传值的过程中变成左值

void func(T&& x)
{
	print(std::forward<T>(x));
}

完美转发使函数调用过程中变量的值类别保持不变。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值