c++ 中 Lambda 的内部 this

Posted

技术标签:

【中文标题】c++ 中 Lambda 的内部 this【英文标题】:Lambda`s internal this in c++ 【发布时间】:2018-02-05 16:48:44 【问题描述】:

如果 lambda 函数 ic C++ 是由 functor 实现的,为什么这是不可能的?

#include <iostream>

class A

public: 
    int a;  
    void f1() []()std::cout << this << std::endl ;();;
;

int main()

    A a;
    a.f1();

我收到错误 9:34: error: 'this' was not captured for this lambda function。如果我理解正确,如果 lambda 被实现为仿函数类,为什么无法获得它的内部 this

编辑:仿函数类的 this,而不是 A 类实例的 this

【问题讨论】:

您需要像[this] () 或通过值或引用来捕获它 @A.A 像你说的那样捕获它。 这是不可能的。有什么意义? “lambda 是通过函子实现的”并不是真的。 Lambda 是一流的功能......它们由编译器本身实现。只是实际上,lambdas 最终基本上等同于以某种方式声明的匿名唯一结构。本质上注意鼬鼠这个词;它们不是 100% 相同的,这就是一个例子。可能它没有完成,因为 a) 没有用例,b) 当您在成员函数中声明 lambda 时,这允许 this 引用封闭类的 this。 你可以用它做的一件事就是递归。 【参考方案1】:

来自lambda:

出于名称查找的目的,确定 这个指针和访问非静态类成员,主体 在上下文中考虑闭包类型的函数调用运算符 的 lambda 表达式。

struct X 
    int x, y;
    int operator()(int);
    void f()
    
        // the context of the following lambda is the member function X::f
        [=]()->int
        
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        ;
    
;

所以,不可能如你所愿引用this

【讨论】:

以上是关于c++ 中 Lambda 的内部 this的主要内容,如果未能解决你的问题,请参考以下文章

使用原子和互斥锁 c++ 在类内部进行线程化

lambda与匿名内部类

java-07 内部类匿名内部类局部内部类lambda

接口,lambda表达式与内部类

C++ lambda表达式总结

c++优先级队列priority_queue使用lambda表达式出错问题