如果我需要生成一个调用成员函数的lambda,我应该通过引用捕获还是捕获“this”?我的理解是,“&”仅捕获使用的变量,而“this”则捕获所有成员变量。那么使用'&'更好吗?
class MyClass {
public:
int mFunc() {
// accesses member variables
}
std::function<int()> get() {
//return [this] () { return this->mFunc(); };
// or
//return [&] () { return this->mFunc(); };
}
private:
// member variables
}
最佳答案
对于您提供的特定示例,您想要的是this
捕获。从概念上讲,通过引用捕获this
并不是很有意义,因为您无法更改this
的值,因此只能将其用作访问类成员或获取类实例地址的指针。在lambda函数内部,如果您访问隐式使用this
指针的内容(例如,您调用成员函数或访问成员变量而未显式使用this
),则编译器会将其视为您始终使用了this
。您也可以列出多个捕获,因此,如果要捕获成员和局部变量,则可以独立选择是按引用还是按值捕获它们。以下文章应为您提供良好的Lambda和捕获基础:
https://crascit.com/2015/03/01/lambdas-for-lunch/
另外,您的示例使用std::function
作为lambda传递回调用方的返回类型。请注意,std::function
并不总是像您想象的那样便宜,因此,如果您能够直接使用lambda而不是必须将其包装在std::function
中,则它可能会更有效。以下文章虽然与您的原始问题没有直接关系,但仍可能为您提供一些有关lambda和std::function
的有用 Material (请参阅存储函数对象的另一种方法部分,但总的来说,本文可能是您感兴趣的):
https://crascit.com/2015/06/03/on-leaving-scope-part-2/