Rokiのチラ裏

学生による学習のログ

C++11でのムーブキャプチャをシミュレート

C++11の文法内ではラムダ式の構文でムーブする事はできない。

auto ptr=std::make_unique<int>(0);
[a=std::move(ptr)](){}(); // From C++14

ググると様々な方法(コピーキャプチャした際にムーブを行わせるラッパー等)が検討されている。その中の1つの方法として、以下にstd::bindへrvalueを渡す方法を提唱する。

std::unique_ptr<int> ptr(new int);
std::bind([](const std::unique_ptr<int>&){},std::move(ptr))();

ptrstd::bindの生成するクロージャ内にムーブされる。クロージャが実行されると、内包する実引数が元々指定されたクロージャに渡される。この時、C++14と同じラムダを生成するという事は、クロージャクラスのメンバ関数operator()がconstであるという事であるから、const lvalue referenceとしなければならない。同じように、mutableなクロージャ(以下例)

[a=std::move(ptr)]()mutable{}();

であれば、lvalue referenceとしなければならない。

std::bind([](std::unique_ptr<int>&)mutable{},std::move(ptr))();