IT评测·应用市场-qidao123.com

标题: 【重学C++】05 | 说透右值引用、移动语义、完美转发(下) [打印本页]

作者: 守听    时间: 2023-5-29 12:10
标题: 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
文章首发

【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
引言

大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第五讲,在第四讲《【重学C++】04 | 说透右值引用、移动语义、完美转发(上)》中,我们解释了右值和右值引用的相关概念,并介绍了C++的移动语义以及如何通过右值引用实现移动语义。今天,我们聊聊右值引用的另一大作用 -- 完美转发
什么是完美转发

假设我们要写一个工厂函数,该工厂函数负责创建一个对象,并返回该对象的智能指针。
  1. template<typename T, typename Arg>
  2. std::shared_ptr<T> factory_v1(Arg arg)
  3. {
  4.         return std::shared_ptr<T>(new T(arg));
  5. }
  6. class X1 {
  7. public:
  8.         int* i_p;
  9.         X(int a) {
  10.                 i_p = new int(a);
  11.         }
  12. }
复制代码
对于类X的调用方来说,auto x1_ptr = factory_v1(5); 应该与auto x1_ptr = std::shared_ptr(new X1(5))是完全一样的。
也就是说,工厂函数factory_v1对调用者是透明的。要达到这个目的有两个前提:
这个就是C++的完美转发。
单看factory_v1应用到X1貌似很"完美",但既然是工厂函数,就不能只满足于一种类对象的应用。假设我们有类X2。定义如下
[code]class X2 {public:        X2(){}        X2(X2& rhs) {                std::cout




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4