11

のがあるstd::listとしclass Tます:

std::list<T> l;

関数に渡すときは、参照を使用します。

someFunction( std::list<T> &l )

sstd::listのa (要素) を渡す最良の方法は何ですか?unique_ptr

std::list< std::unique_ptr<T> >  l;

このような:

someFunction( std::unique_ptr<T> ptr )

またはこれ:

someFunction( T* ptr )

またはこれ:

someFunction( T &ref )

そして、たとえばstd::list's関数を使用してどのように呼び出すのでしょうか? back()これらはすべて「一種の」同等のものですが、ここで何かが欠けていると確信しています。

ありがとう

4

3 に答える 3

9

良いものから悪いものへの順序:

  1. someFunction(const T&);
  2. someFunction(T&);
  3. someFunction(const std::unique_ptr<T>&);
  4. 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.
于 2010-07-11T11:55:11.060 に答える
2

値で渡さないでくださいunique_ptr。まず、 がないとコンパイルされstd::moveません。使用std::moveすると、に格納されている値が空になり、listそれ以上アクセスできなくなります。

これは、unique_ptrがコピー可能ではなく、 type のコピー コンストラクターを持たずunique_ptr::unique_ptr(const unique_ptr<T>& other)、ムーブ コンストラクター ( unique_ptr::unique_ptr(unique_ptr<T>&& source)) しか持たないためです。

于 2010-07-11T12:33:07.967 に答える