
項目 32:クロージャ内にオブジェクトをムーブする場面では初期化キャプチャを用いる
|
235
auto func =
std::bind( // C++11 emulation
[](std::vector<double>& data) mutable // of init capture
{ /* uses of data */ }, // for mutable lambda
std::move(data)
mutable なラムダの初期化キャ
プチャを C++11 でエミュレート
);
バインドオブジェクトは、std::bind に与えた全実引数のコピーを保持するため、上例のバイン
ドオブジェクトでも先頭実引数のラムダから生成したクロージャのコピーを保持します。そのため、
クロージャのライフタイムはバインドオブジェクトのライフタイムに一致します。この点は重要で
す。クロージャが存在する限り、バインドオブジェクトが保持する疑似ムーブキャプチャオブジェ
クトも存在し続けるのです。
std::bind にお目にかかるのが初めてならば、ここまでの説明がすべて納得いくまでお気に入り
の C++11 レファレンスマニュアルを熟読する必要があるかもしれません。その場合でも、次に挙げ
るポイントは明確に理解してください。
•
C++11 のクロージャ内でオブジェクトのムーブコンストラクトは不可能だが、C++11 のバイン
ドオブジェクト内へは可能である。
•
バインドオブジェクト内へオブジェクトをムーブコンストラクトし、そのオ