守听 发表于 2023-5-29 12:10:09

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

文章首发

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

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

假设我们要写一个工厂函数,该工厂函数负责创建一个对象,并返回该对象的智能指针。
template<typename T, typename Arg>
std::shared_ptr<T> factory_v1(Arg arg)
{
        return std::shared_ptr<T>(new T(arg));
}

class X1 {
public:
        int* i_p;
        X(int a) {
                i_p = new int(a);
        }
}对于类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。定义如下
class X2 {public:        X2(){}        X2(X2& rhs) {                std::cout
页: [1]
查看完整版本: 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)