I'm not sure how consistent we are with how shared_ptr is used as a parameter to methods and as a return type. In reviewing and writing code I've been using these guidelines for myself and I was wondering if they align with others:
1. If a copy of a shared_ptr is not intended to be made by the method then use a const ref to underlying type. i.e. void Foo(const Array& array) is preferable to void Foo(const shared_ptr<Array>& array) [1]. 2. If a copy is always going to be made pass by value. i.e. void Foo(std::shared_ptr<Array>) and to std::move within the method. The last time I did research on this allowed for eliminating shared_ptr overhead if the caller also can std::move() the parameter. 3. If a copy might be made pass the shared_ptr by const reference. i.e. void Foo(const shared_ptr<T>& array) The exception to this if the contents of the shared_ptr a reference can effectively be copied cheaply without as is the case with Array via ArrayData in which case #1 applies. 4. For accessor methods prefer returning by const ref or underlying ref to underlying when appropriate. i.e. const std::shared_ptr<Array>& foo() or const Array& Foo(). 5. For factory like methods return a copy i.e. std::shared_ptr<Array> MakeFoo(); Is this other people's mental model? I'd like to update our style guide so we can hopefully drive consistency over time. Thanks, Micah [1] Array is somewhat of a special case because one can have essentially the same shared_ptr copy semantics by copying the underlying ArrayData object.