オブジェクトの有効期間がラムダ関数が呼び出される時点まで確実に延長されるように、ラムダの値で shared_ptr をキャプチャしたくありません。
それ以外の場合、実際には shared_ptr は必要ありません。私が行った場合:
shared_ptr<..> sp;
sp->async_call( [sp](){} );
本体が参照していない場合でも、sp がコピーされることが保証されていますか?
この見積もりのおかげで、それは保証されていると言えます。
5.1.2
21 ラムダ式が評価されると、コピーによってキャプチャされたエンティティを使用して、結果のクロージャー オブジェクトの対応する各非静的データ メンバーが直接初期化されます。(配列メンバーの場合、配列要素は添え字の昇順で直接初期化されます。) これらの初期化は、非静的データ メンバーが宣言された (指定されていない) 順序で実行されます。[注: これにより、破壊が構築の逆の順序で発生することが保証されます。— エンドノート]
編集:オブジェクトが直接初期化されているため、考え直してみると、コピーの省略は機能しません。
のコピー省略の基準により、 § 12.8
投稿するには長すぎます。コピーを省略できるとは思いません
std::shared_ptr
ただし、ほとんどの場合、スレッド セーフではないことに注意してください。