当前位置: 首页 > 知识库问答 >
问题:

通过lambda中的显式此参数访问捕获的变量

雍志文
2023-03-14

来自声明/功能/9.3.4.6/6.2(我很抱歉如何引用标准中的具体句子):

显式对象参数声明是带有this说明符的参数声明。显式对象参数声明只能作为参数声明列表的第一个参数声明出现:(6.1)声明成员函数的成员声明符([class.mem])或(6.2)lambda声明符([expr.prim.lambda])。

如果lambda表达式允许此作为显式对象参数,那么当我们同时捕获变量时会发生什么?

根据我的理解,如果引擎盖下有lambda:

[x = 2](this auto& func) { x = 4; }();

可能大致相当于:

class lambda01 {
  private:
    int x;

  public:
    constexpr lambda01(cons int& x_)
    : x{x_} {}

    constexpr void operator()(this lambda01& func) {
      func.x = 4;
    }
};
lambda04 lambda04_obj {2};
lambda04_obj.operator()();

如果这是对的。

例如,1号:

int x;

// is it:
[&x](this auto& func){ x = 4; }();

assert(x == 4);

// or:
[&x](this auto& func){ func.x = 2; }();

assert(x == 2);
  • 两个表达式都有效吗?
  • lambda取l-value对象参数有效吗?

例如,将以variadic格式打印参数的2号示例:

[]<typename... Args>(const Args&... args) {
  [&](this auto func){
    /** ... **/
  };
}(1, 2, 3, 4);

从注释的表达式中,哪一个是有效的?

  • <代码>(std::cout

如果第二个选择是有效的,那么这就值得再问一个关于1个对象中可能的参数包的问题。

简而言之,在lambda中使用点运算符访问的捕获变量是否有效,以获取显式对象参数?

共有1个答案

龙枫
2023-03-14

标准不允许:

对于copy捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。

如果它是“未命名的”,那么你不能命名它。有一种特定的语言可以将捕获实体的名称转换为基于此表达式的表达式,但仅此而已。

因此,您可以使用显式this参数,捕获实体的名称将自动使用它。但是您不能通过显式参数访问这些变量。

在lambda中显式获取this的唯一原因是使用标准提供的接口:调用lambda。AKA:递归调用lambda而不命名lambda。

 类似资料:
  • 对不起,我不知道这个问题的标题是什么。 我在C中有一个函数,它以λ作为参数。 然后我尝试调用这个函数。 我的问题是,我无法从lambda函数内部访问变量,如果我试图用

  • 创建资源“/flowers”和GET方法 获取->方法请求->URL查询字符串参数->添加了“颜色” 获取->集成请求->类型:Lambda函数 获取->集成请求->URL查询字符串参数->添加的, 我试图访问lambda处理程序中的参数,但事件总是空的,我不知道参数应该在哪里 我想我不能使用主体映射tamplate,除非我没有使用get的请求主体。

  • 问题内容: 我刚刚开始学习Go,有些事情引起了我的注意。 功能如下: 等等。作为来自C语言的人,我想知道: 1)是否可以通过变量本身来调用这些函数(如中所述)? 2)这是一种常见的做法(定义泛型函数并让其找出类型及其应执行的操作),还是仅用于内置类型。例如,如果我要定义自己的类型,例如,是否应该在类型内定义和附加函数,并将其命名为 还是应该定义一个接收列表的函数,例如: 问题答案: 1-您不能将内

  • 我正在尝试将我的项目更新为Swift 3.0,但我遇到了一些困难。我得到了下一个错误:“转义闭包只能通过值显式捕获inout参数”。 问题出在以下函数内部: 有人可以帮我解决这个问题吗?

  • 问题内容: 我正在尝试编写一种使用反射将在类中获取私有字段的方法。 这是我的课程(此示例已简化): 所以说我这样做: 我得到一个因为是私人的。有没有一种方法可以使用反射来获取/设置私有变量?(我已经在C#中完成了,但这是我第一次在Java中尝试过它)。如果您想知道为什么需要这样做:),这是因为有时在单元测试期间,将私有变量设置为虚假值以进行故障测试等很方便。 问题答案: 弄清楚了。需要

  • 问题内容: 我的视图代码基本上是这样的: 我想在Django模板中执行的操作是: 我想要这样输出: 但是通过变量名称via对dict的引用实际上不起作用。我怀疑它是在内部而不是在做。有什么办法可以解决此问题? 问题答案: 没有内置的方法可以执行此操作,您需要编写一个简单的模板过滤器才能执行此操作:http : //code.djangoproject.com/ticket/3371