NOTE: Last year, I posted three new GotWs numbered #103-105. I decided leaving a gap in the numbers wasn’t best after all, so I am renumbering them to #89-91 to continue the sequence. Here is the updated version of what was GotW #105.

How should you prefer to pass smart pointers, and why?



Problem



JG Question



1. What are the performance implications of the following function declaration? Explain.

void f( shared_ptr<widget> );

Guru Questions



2. What are the correctness implications of the function declaration in #1? Explain with clear examples.

3. A colleague is writing a function f that takes an existing object of type widget as a required input-only parameter, and trying to decide among the following basic ways to take the parameter (omitting const):

void f( widget* ); (a)

void f( widget& ); (b)

void f( unique_ptr<widget> ); (c)

void f( unique_ptr<widget>& ); (d)

void f( shared_ptr<widget> ); (e)

void f( shared_ptr<widget>& ); (f)

Under what circumstances is each appropriate? Explain your answer, including where const should or should not be added anywhere in the parameter type.

(There are other ways to pass the parameter, but we will consider only the ones shown above.)