您好,登录后才能下订单哦!
本篇内容主要讲解“C++的std::forward怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++的std::forward怎么使用”吧!
If the object is to be passed onward to other code and not directly used by this function, we want to make this function agnostic to the argument const
-ness and rvalue-ness.
如果对象不在本函数内部使用而是继续传递给其他代码,我们希望本函数不会改变参数的常数特性和右值特性。
考虑下面的函数:
string f(string&& s){ if(s.size()) s[0]=toupper(s[0]); return s}
右值引用作为参数类型使用的时候,首先被实参初始化,其结果是实参将无效化(右值引用的定义)。在函数内部,由于s已经夺取了实参的内容,因此可以作为左值自由使用。但是如果不是在函数体中直接使用而希望作为右值继续传递给另外一个函数,就不能直接使用s作为实参(因为它已经变成了左值引用),而是使用forward恢复它的右值特性。
在这种情况下,也只有在这种(右值引用参数只传递不使用)情况下,将TP参数定义为TP&&(这里TP是模板类型)--这样可以无视并维持常量特性和右值特性。因此任何使用TP&&的代码声明了它不在乎变量的常量特性和右值特性(因为已经被忽略),但会将该值(不加改变地)继续传递给其他不在乎常量特性和右值特性的代码(因为这些特性会被维持)。因为任何从调用者传来的临时对象都会在函数调用期间保持有效性(原因是调用者只有在函数调用之后才有机会销毁这个对象),因此当TP&&被作为参数(在函数内部)使用时是安全的。TP&&类型的参数本质上总是应该在函数体中通过std::forward继续传递的。
译者注:最终还是要被某段代码作为左值使用的。
template <class F, class... Args>inline auto invoke(F f, Args&&... args) { return f(forward<Args>(args)...);}
到此,相信大家对“C++的std::forward怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。