通过引用或按值将共享指针作为参数传递给 class

Passing a shared pointer by reference or by value as parameter to a class

如果要将共享指针复制到成员变量,它应该通过引用还是通过值作为参数传递给 class?

共享指针的复制会增加引用计数,我不想进行任何不必要的复制,从而增加引用计数。将共享指针作为参考传递可以解决这个问题吗?我想是的,但是还有其他问题吗?

按值传递:

class Boo {
public: 
    Boo() { }
};

class Foo {
public:
    Foo(std::shared_ptr<Boo> boo) 
        : m_Boo(boo) {}
private:
    std::shared_ptr<Boo> m_Boo;
};

int main() {
    std::shared_ptr<Boo> boo = std::make_shared<Boo>();

    Foo foo(boo);
}

通过引用:

class Boo {
public: 
    Boo() { }
};

class Foo {
public:
    Foo(std::shared_ptr<Boo>& boo) 
        : m_Boo(boo) {}
private:
    std::shared_ptr<Boo> m_Boo;
};

int main() {
    std::shared_ptr<Boo> boo = std::make_shared<Boo>();

    Foo foo(boo);
}

shared_ptr 在传递给函数时应该像对待任何其他 class 一样对待。 在这种情况下,您应该传递给常量引用。

为什么我写 为什么我写 Herb Sutter 跳到最小值 21:50 https://www.youtube.com/watch?v=xnqTKD8uD64

按值传递然后将其移动到成员中:

class Foo {
public:
    Foo(std::shared_ptr<Boo> boo) 
        : m_Boo(std::move(boo)) {}
private:
    std::shared_ptr<Boo> m_Boo;
};

这在所有情况下都是最有效的 - 如果调用者有一个 rvalue-reference 则不会有单个 add-ref,如果调用者有一个值则只有一个 add-ref.

如果您通过 const&,即使在不必要的情况下,您也会强制执行 add-ref。如果您按值传递然后在没有 std::move 的情况下进行设置,您可能会得到 2 add-refs.

编辑:如果你有一个 class 移动比复制便宜得多,并且你有一个函数调用,它总是复制传入的实例,那么这是一个很好的模式 -就像在这种情况下一样。您通过按值获取它来强制在函数调用边界发生复制,然后如果调用者有右值引用,则根本不需要复制 - 它会被移动。