flash网站的制作,外贸建站wordpress主题,错题网站开发,网站规划 评价一、右值引用
在C11中出现了右值引用#xff0c;想知道右值引用#xff0c;就必须知道右值。在前面分析过左右和消亡值等类型#xff08;见“左值和右值再谈”#xff09;#xff0c;其实右值就是为了废物利用#xff0c;而既然利用的好#xff0c;就有了和左值一样的引…一、右值引用
在C11中出现了右值引用想知道右值引用就必须知道右值。在前面分析过左右和消亡值等类型见“左值和右值再谈”其实右值就是为了废物利用而既然利用的好就有了和左值一样的引用也就是右值引用。 右值引用仅绑定右值用于可移动对象的应用其形式类似于 type。
二、万能引用
万能引用就是既可以传右值也可以传递左值既然都可以使用所以叫万能引用。万能引用也使用类似T的形式。既然右值引用和万能引用都使用相同的类似形式那么如何区分二者就是一个问题了。
三、区别
在C的应用中一般模板编程中万能引用比较多而普通编程中右值引用比较多。那么如何具体的判断是万能引用还是右值引用呢可以使用下面几点 1、右值引用必须传递右值否则编译无法通过而万能引用左右值均可传递 2、万能引用不能有const修饰符否则成为右值引用 3、万能引用必须有一个推导的过程这也意味着上面说的模板中应用比较多 4、auto一般有一个推导过程所以auto 绑定时也是万能引用 5、一般右值会使用std::move来处理而万能引用使用std::forward
另外还有几个注意点 1、应该避免对万能引用的函数进行重载因为之所以称为万能引用就是因为其可以精确匹配到具体的数据类型再做重载没有什么 意义。 2、对引用折叠在万能引用中的处理 3、类和继承中构造函数重载中的万能引用问题处理需要显示的使用const或限制条件如enable_if等来与万能引用区分
四、例程
说得再清楚也有理解上的差别现在看几个例子就明白了 templatetypename Tvoid f(T t); //万能引用auto var2 v1; //万能引用auto推导和模板推导产生的结果一样templatetypename Tclass A{templatetypename Nvoid test(Nn){} //万能引用};int a 100; //右值引用templatetypename Tvoid f(std::listT t); //右值引用templatetypename Tclass A{void test(Tt){} //右值引用没有推导过程};五、总结
细节决定成败这句话不是没有道理的。一些小的基础的问题往往是解决一些疑难问题的入手之处。综合运用各种基础技术就可以形成更高层次的抽象应用这个在模板元编程中体现的就非常明显。往往很多方法都知道什么意思但组合起来就不知道了这其实还是基础不太牢靠只是僵硬的学会了而没有活学活用。