関数への共有ポインタを渡したい。それを手伝ってくれませんか。
確かに、私はあなたを助けることができます。C ++の所有権のセマンティクスについてある程度理解していると思います。本当?
ええ、私はその主題にかなり満足しています。
良い。
わかりました、私はshared_ptr
議論をする2つの理由しか考えることができません:
- 関数はオブジェクトの所有権を共有したいと考えています。
- この関数は、特に機能するいくつかの操作を実行します
shared_ptr
sでます。
どちらに興味がありますか?
私は一般的な答えを探しているので、実際には両方に興味があります。ただし、ケース2の場合の意味については興味があります。
このような関数の例には、次のものがあります。 std::static_pointer_cast
、カスタムコンパレータ、または述語が含まれます。たとえば、ベクトルからすべての一意のshared_ptrを検索する必要がある場合は、そのような述語が必要です。
ああ、関数が実際にスマートポインタ自体を操作する必要があるとき。
丁度。
その場合は参考にすればいいと思います。
はい。また、ポインタが変更されない場合は、const参照を渡します。所有権を共有する必要がないため、コピーする必要はありません。それは別のシナリオです。
はい、わかった。他のシナリオについて話しましょう。
あなたが所有権を共有するもの?OK。所有権をどのように共有しますかshared_ptr
ますか?
それをコピーすることによって。
次に、関数はのコピーを作成する必要がありますshared_ptr
、正しいですか?
明らかに。だから私はそれをconstへの参照で渡し、ローカル変数にコピーしますか?
いいえ、それは悲観的です。参照によって渡された場合、関数は手動でコピーを作成する以外に選択肢はありません。値が渡された場合、コンパイラーはコピーと移動のどちらかを選択して自動的に実行します。したがって、値を渡します。
いい視点ね。「スピードが欲しい?価値を渡す」という記事をもっと頻繁に覚えておく必要があります。
shared_ptr
たとえば、関数がをメンバー変数に格納するとどうなるでしょうか。それは冗長なコピーを作成しませんか?
この関数は、shared_ptr
引数をストレージに移動するだけです。引っ越しshared_ptr
と、参照カウントが変更されないため安価です。
ああ、いい考えだ。
しかし、私は3番目のシナリオを考えています。操作したくない場合shared_ptr
や所有権を共有したくない場合はどうなりますか?
その場合、shared_ptr
は機能とはまったく関係ありません。ポインティを操作する場合は、ポインティを取得し、呼び出し元に必要な所有権セマンティクスを選択させます。
そして、私はポインティを参照または値でとるべきですか?
通常のルールが適用されます。スマートポインタは何も変更しません。
コピーする場合は値で渡し、コピーを避けたい場合は参照で渡します。
正しい。
うーん。さらに別のシナリオを忘れたと思います。所有権を共有したいが、特定の条件にのみ依存する場合はどうなりますか?
ああ、興味深いエッジケース。私はそれが頻繁に起こるとは思わない。ただし、それが発生した場合は、値を渡して必要がない場合はコピーを無視するか、参照を渡して必要に応じてコピーを作成することができます。
私は最初のオプションで1つの冗長なコピーを危険にさらし、2番目のオプションで潜在的な動きを失います。ケーキを食べて食べられないの?
それが本当に重要な状況にある場合は、2つのオーバーロードを提供できます。1つはconst左辺値参照を取り、もう1つは右辺値参照を取ります。1つはコピーし、もう1つは移動します。完全転送関数テンプレートは別のオプションです。
私はそれがすべての可能なシナリオをカバーしていると思います。どうもありがとうございました。
const std::shared_ptr<myClass>& arg1