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

打印 上一主题 下一主题

主题 888|帖子 888|积分 2664

文章首发

【重学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对调用者是透明的。要达到这个目的有两个前提:

  • 传给factory_v1的入参arg能够完完整整(包括引用属性、const属性等)得传给T的构造函数。
  • 工厂函数factory_v1没有额外的副作用。
这个就是C++的完美转发。
单看factory_v1应用到X1貌似很"完美",但既然是工厂函数,就不能只满足于一种类对象的应用。假设我们有类X2。定义如下
[code]class X2 {public:        X2(){}        X2(X2& rhs) {                std::cout
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表