C++ lambda 捕获 this vs 通过引用捕获

标签 c++ c++11 lambda std-function

如果我需要生成一个调用成员函数的 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 中,它可能会更有效。以下文章虽然与您的原始问题没有直接关系,但仍可能为您提供一些与 lambdas 和 std::function 相关的有用 Material (请参阅存储函数对象的另一种方法部分,但一般情况下可能会感兴趣):

https://crascit.com/2015/06/03/on-leaving-scope-part-2/

关于C++ lambda 捕获 this vs 通过引用捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575563/

相关文章:

C++: "illogical"析构函数行为

c++ - 是否未指定在未评估的上下文中实例化模板/lambda?

c# - Lambda 表达式的代码覆盖率

c++ - 使用原始类型进行模乘的方法

android - Kotlin、NDK 和 C++ 交互

c++ - 带有内存定位文件的 FFmpeg avformat_open_input

c++ - GLFW 中的内存泄漏

c++ - 类成员是一个类型未知的派生对象

C++ std::regex 多行语法

python - 对于 Python 3.3,如何使用一个 lambda 语句创建函数列表?