読者です 読者をやめる 読者になる 読者になる

C++1z ラムダ式での*thisのコピーキャプチャ

C++

ラムダ式のキャプチャリストに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のキャプチャ方式を同時に複数指定することはできません。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。