c++11 std::forward使用场景以及作用

摘要:
当不使用std::forward时,无论传入何种类型的参数,以下代码G都只调用void F;使用namespacestd;Void F{cout<<“int&version”<<a<<<endl;}Void F{//dosomethingout<<“int&version”><a<˂<endl,}template<classA>Void G{F;}int main{int=2;G;//int&version G;//int&version return0;}当使用std::forward时,G的最终调用被区分;使用namespacestd;Void F{cout<<“int&version”<<a<<<endl;}Void F{//dosomegcut<<“int&version”><a<˂<endl”}template<classA>Void G{F;}int main{inti=2;G;G;return0;}使用和不使用std::forward之间的区别:在函数模板Void G中无法知道与形参对应的实际参数。它是公共变量还是即将失效的临时变量?您只能将std::forward完美地转发到函数模板void G调用的下一个函数。
  • 不使用 std::forward时,下述代码G不管传入什么类型的参数,只会最终调用 void F(int& a);
using namespace std;

void F(int& a) {
    cout << "int& version " <<a <<endl;
}

void F(int&& a) {
    // do something
    cout << "int&& version " <<a <<endl;
}

template<class A>
void G(A &&a) {
    F(a); 
}

int main (int argc, char *argv[]) {
    int i = 2;
    G(i); //int& version
    G(5); //int& version
  return 0; 
}
  • 用 std::forward时,G的最终调用出现差异化;
using namespace std;

void F(int& a) {
    cout << "int& version " <<a <<endl;
}

void F(int&& a) {
    // do something
    cout << "int&& version " <<a <<endl;
}

template<class A>
void G(A &&a) {
    F(std::forward<A>(a));
}

int main (int argc, char *argv[]) {
    int i = 2;
    G(i); 
    G(5);
    return 0;
}
  • 使用与不使用 std::forward的区别:

函数模板 void G(A &&a)内部是无法知道形参对应的实参,到底是个普通变量,还是濒死的临时变量?

只能原封不动的完美的转发std::forward给函数模板 void G(A &&a)调用的下一层函数。

所以,std::forward转发问题针对的是模板函数。

免责声明:文章转载自《c++11 std::forward使用场景以及作用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sqlite简介批处理命令篇--配置免安装mysql下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 数据类型

C#的数据类型可以分为3类:数值类型,引用类型,指针类型.指针类型仅在不安全代码中使用.值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型.引用类型包括类类型,接口类型,代表类型和数组类型.值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的变量把它们的引用存储在对象中.对于引用类型的变量,完全有可能让两个不同的变量引用同一...

【二分答案】洛谷P2678 [NOIP2015 提高组] 跳石头/P1824 进击的奶牛/P2440木材加工/P1873 砍树

 【跳石头】 题意:需要移掉尽可能少的石头,使得最近的两个石头距离最远。 思路:枚举会超时,二分答案。 大佬的文章写得非常清楚:https://www.luogu.com.cn/blog/user20197/solution-p2678 1 #include <iostream> 2 3 using namespace std; 4...

poj2349最小生成树prim算法

题目:有s个satellite channels,但有p(p>s)个地方,若任意两个地方有satellite channels,则无视该距离,并且剩余的地方只能与其他地方通过无线电连接,需要距离,且需要的距离只与最大距离有关,问该最大距离的最小值(大概是这样啦)分析:实际上就是求最小生成树中的第p-s大的数,可以先通过prim算法生成最小生成树,然后...

winform使用Barcodex控件预览和打印一维码

1、控件下载。   http://files.cnblogs.com/files/masonblog/barcodex.zip 。   包含barcodex.ocx控件、barcodex帮助文档、两个winform控件的dll文件。 2、控件的注册。 (1)检测控件是否注册(方法不唯一)。   本例使用的是判断注册表中 HKEY_CLASSES_ROOTT...

Sort函数(C++)

原创 C++中内置了sor函数供排序,函数原型为: #include<algorithm>  //所属头文件 sort(begin,end,cmp); //其中cmp参数可以省略,省略后默认升序排序 如果要进行降序排序,需要另外定义cmp函数: bool cmp(int a,int b){ //降序排序 return...

《Qt数据类型》--QByteArray,QString,int,hex之间的转化

对于QString和QByteArray,他们都有一个toInt的静态函数,QString::toInt()是根据string的字面值转化为int类型,比如string:"123",转化为int类型就变为int:123。而对于QByteArray::toInt()是将16进制的数据转化为10进制之后得到int类型,比如byte:0xf8-->dec:...