まず、免責事項:
shared_ptr万能薬ではありません。所有権が実際に共有されている場合に使用する必要があります。非共有の所有権は (生の) 参照によって表されunique_ptr、非所有権は (生の) 参照によって表されます。weak_ptrは、監視shared_ptrする必要があるが所有されていない a 用です...しかし、一般的に古いポインターに対する適切な防御方法ではありません。デフォルトの toshared_ptrは、最小公分母に直接適用されます。それは貧弱なプログラミングの練習です。
ここでの選択肢はshared_ptr< T >、 、shared_ptr< T const >、shared_ptr< T > const &、T const &およびT &です。何も変更していないと仮定しましょうが、シーケンスはそのオブジェクトを変更する可能性constがあるため、望ましいことです。shared_ptr< T const >、shared_ptr< T > const &、およびに絞り込みT const &ます。
質問を次のように再定式化しましょう。
shared_ptr< T > const &正しい選択はありますか?
この観点から、代替案を評価します。
バランスをとって、所有権が拡張されていない場合 (引数を保持するオブジェクトを返すなど)、単純な参照を渡す必要があります。そのような場合、関数はその引数がどのように所有されているかを気にする必要はほとんどありません。それを必要とshared_ptrすることは、最悪の場合、懸念の分離に違反します。ローカル オブジェクトまたはメンバー サブオブジェクトを保持したまま関数を使用することはできません。そして何よりも、すべてがより複雑です。
所有権が他の誰かに拡張される可能性がある場合、それがshared_ptr最初に使用する正当な理由となる場合は、常に値渡しする必要がありshared_ptr< [const] T >ます。はい、オンコールをコピーしshared_ptrます。しかし、a をコピーすることのコストのかかる部分はshared_ptr、refcount を更新することであり、ポインターをスタックにプッシュすることではありません。また、所有権を譲渡する場合は、とにかく refcount を更新する必要があります。渡された値とmove、refcount に触れない値を取得します。これを行うと、参照渡しには利点がなく、多くの欠点が残ります。