ラムダ式のキャプチャリストにthis
を指定した場合、そのラムダ式が所属するクラスのオブジェクトが参照キャプチャされます。
非同期処理や並列処理を記述するような状況で*this
が参照キャプチャされると、そのオブジェクトの寿命を管理するのが難しくなります。
C++1zではラムダ式のキャプチャリストに*this
を指定することで、*this
のオブジェクトがコピーキャプチャされるようになります。
std::vector<std::function<void()>> taskList; struct X { void g(); void f() { // *thisをコピーして、 // コピーしたオブジェクトのメンバ関数g()を呼び出す関数をタスクリストに登録する taskList.push_back([*this] { g(); }); } };
=
によるデフォルトコピーキャプチャ、および&
によるデフォルト参照キャプチャは、どちらも従来通り*this
は参照キャプチャされます。*this
だけはコピーでキャプチャする新しいデフォルトキャプチャ記号も提案されましたが、採用はされていません。
[=, *this]
のように、デフォルトコピーキャプチャと*this
によるコピーキャプチャは、同時に指定できます。
[this, *this]
のように、*this
のキャプチャ方式を同時に複数指定することはできません。
参照
- P0018R0 Lambda Capture of
*this
by Value - P0018R1 Lambda Capture of
*this
by Value - P0018R2 Lambda Capture of
*this
by Value - P0018R3 Lambda Capture of
*this
by Value as[=,*this]
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。