我从 Objective-C 背景来到 C++11,我正在努力接受的一件事是 C++11 lambda 与 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。是否有一些不易出错的方法来实现这一目标?