C++源码分析完美转发

C++源码分析完美转发

  • 完美转发作用:
    • 可以保持实参数据在函数中的左值或者右值类型。

不使用完美转发的后果

引入完美转发

  • 源码:

    • template
      	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
      	{	// forward an lvalue as either an lvalue or an rvalue
      	return (static_cast<_Ty&&>(_Arg));
      	}
      
      template
      	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept
      	{	// forward an rvalue as an rvalue
      	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
      	return (static_cast<_Ty&&>(_Arg));
      	}
      
  • 源码实现了两个版本的forward重载函数

    • 左值引用版本的

      • 调用场景

        • 不管传入的是左值右值,形参val都是左值,所以调用的都是forward的左值引用版本

        • 	template
          	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
          	{	// forward an lvalue as either an lvalue or an rvalue
          		cout << "remove_reference_t<_Ty>& _Arg" << endl;
          		return (static_cast<_Ty&&>(_Arg));
          	}
          
          • 如果实参类型是int& + && -> **int&**就保持了实参的左值引用类型
          • 如果实参类型是int&& + && -> **int&&**就保持了实参的右值引用类型。
        • C++源码分析完美转发_第2张图片

    • 右值引用:

      • 只有传入的参数是 右值时,才会调用

        • template
          	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept
          	{	// forward an rvalue as an rvalue
          	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
          	return (static_cast<_Ty&&>(_Arg));
          	}
          
        • image-20230519135747009

总结

  • 利用完美转发,我们可以可以保持实参数据在函数中的左值或者右值类型,从而达到我们想要的效果

你可能感兴趣的:(C++,c++,算法,开发语言)