私は Objective-C の背景から C++11 に来ました。私が同意するのに苦労していることの 1 つは、C++11 ラムダと Objective-C の「ブロック」の異なるキャプチャ セマンティクスです。(比較については、こちらを参照してください)。
Objective-C では、C++ と同様に、メンバー変数を参照するとself
/this
ポインターが暗黙的にキャプチャされます。ただし、Objective-C のすべてのオブジェクトは事実上「共有ポインター」であるため、C++ の用語を使用すると、次のようにすることができます。
doSomethingAsynchronously(^{
someMember_ = 42;
});
...そして、ブロックが実行されたときに、アクセスしているメンバーを持つオブジェクトが生きていることが保証されます。考える必要はありません。C++ で同等のものは次のようになります。
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
ここで、this ポインターに加えて shared_ptr をキャプチャーすることを忘れないでください。これを達成するためのエラーが発生しにくい方法はありますか?