为了账号安全,请及时绑定邮箱和手机立即绑定

使用前向的优点

使用前向的优点

C++ C
幕布斯7119047 2019-06-04 16:32:22
使用前向的优点在完美的转发中,std::forward用于转换命名的rvalue引用。t1和t2到未命名的rvalue引用。这样做的目的是什么?这将如何影响被调用的函数?inner如果我们离开t1 & t2作为落伍?template <typename T1, typename T2>void outer(T1&& t1, T2&& t2) {     inner(std::forward<T1>(t1), std::forward<T2>(t2));}
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

在完美转发中,std:Forward用于将命名的rvalue引用T1和T2转换为未命名的rvalue引用。这样做的目的是什么?如果我们把t1和t2作为lvalue,这会对调用的函数内部产生什么影响?

template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) {
    inner(std::forward<T1>(t1), std::forward<T2>(t2));}

如果在表达式中使用命名的rvalue引用,则它实际上是lvalue(因为您按名称引用对象)。考虑以下示例:

void inner(int &,  int &);  // #1void inner(int &&, int &&); // #2

现在,如果我们打电话outer像这样

outer(17,29);

我们希望将17和29转发到#2,因为17和29是整数值,因此rvalue。但既然t1t2在表达中inner(t1,t2);如果是lvalue,您将调用#1而不是#2。这就是我们需要将引用转换回未命名引用的原因。std::forward..所以,t1在……里面outer总是一个lvalue表达式,而forward<T1>(t1)可能是一个rvalue表达式,取决于T1..后者只是一个lvalue表达式,如果T1是一个无值引用。和T1仅在外部的第一个参数是lvalue表达式的情况下才推断为lvalue引用。


查看完整回答
反对 回复 2019-06-04
  • 3 回答
  • 0 关注
  • 493 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信