Я пришел на С++ 11 из фона Objective-C, и одна вещь, с которой я пытаюсь договориться, - это различные захватывающие семантики блоков С++ 11 lambdas vs Objective-C. (См. здесь для сравнения).
В Objective-C, как и С++, указатель self
/this
неявно захватывается, если вы ссылаетесь на переменную-член. Но поскольку все объекты в Objective-C являются эффективными "общими указателями", чтобы использовать терминологию С++, вы можете сделать это:
doSomethingAsynchronously(^{
someMember_ = 42;
});
... и вам гарантируется, что объект, чей член, к которому вы обращаетесь, будет активным, когда выполняется блок. Вам не нужно об этом думать. Эквивалент в С++ выглядит примерно так:
// 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.
});
Здесь вам нужно запомнить захват shared_ptr в дополнение к этому указателю. Есть ли какой-то менее склонный к ошибкам способ достичь этого?