J'ai adopté le C++11 après avoir travaillé en Objective-C, et j'ai du mal à accepter la différence de sémantique de capture entre les lambdas du C++11 et les "blocs" de l'Objective-C. (Cf. (Voir aquí pour une comparaison).
En Objective-C, comme en C++, le self
/ this
Le pointeur est implicitement capturé si vous faites référence à une variable membre. Mais comme tous les objets en Objective-C sont effectivement des "pointeurs partagés", pour reprendre la terminologie du C++, vous pouvez le faire :
doSomethingAsynchronously(^{
someMember_ = 42;
});
... et vous avez la garantie que l'objet dont vous accédez au membre sera vivant lorsque le bloc sera exécuté. Vous n'avez pas à y penser. L'équivalent en C++ semble être quelque chose comme :
// 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.
});
Ici, vous devez vous rappeler de capturer le shared_ptr en plus du this pointer. Existe-t-il une méthode moins sujette aux erreurs pour y parvenir ?