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))();
ptr
はstd::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))();