良いものから悪いものへの順序:
- someFunction(const T&);
- someFunction(T&);
- someFunction(const std::unique_ptr<T>&);
- someFunction(std::unique_ptr<T>&);
最初のものは、オブジェクトを変更せず、割り当て方法に関係なくオブジェクトで動作するため、最適です (たとえば、問題なく shared_ptr に切り替えることができます)。
使用しているスマート ポインターに関係なく、2 番目も機能します。ただし、オブジェクトを変更できることを前提としており、何かを const にできる場合はいつでも変更する必要があります。
番号 3 と 4 はどちらも、指しているオブジェクトを変更できます。ただし、#3 ではスマート ポインターを変更できませんが、番号 4 では変更できます。どちらもunique_ptrの使用を強制するという欠点がありますが、上の2つはスマートポインタークラスに関係なく機能します。
他のいくつかの例のように、unique_ptr を値で渡すことはオプションではありません。unique_ptr は一意であると想定されています。コピーする場合は、shared_ptr の使用を検討してください。
最初の 2 つは、back() の結果で呼び出すと、次のようになります。
someFunction(*(lst.back())); // dereference lst.back() before passing it in.
後者の 2 つの場合、back() の結果で呼び出すと、次のようになります。
someFunction(lst.back()); // pass the smart pointer, not the object to
// which the smart pointer currently points.