【问题标题】:What is the type of a lambda expression for the compiler?编译器的 lambda 表达式的类型是什么?
【发布时间】:2021-11-30 20:57:08
【问题描述】:

所以,如果我们在以下源代码上运行gdb

//...
auto myLambda1 = [&](int x){ printf("Hi, I got x=%d here\n",x);};
auto myLambda2 = [&](double y){ printf("Hi, I got y=%f here\n",y);};
//...

我会得到:

(gdb) ptype myLambda1
type = struct <lambda(int)> {
}
(gdb) ptype myLambda2
type = struct <lambda(double)> {
}

那么什么是编译器的 lambda 表达式?为什么是struct

【问题讨论】:

  • 检查 cppinsights 以了解编译器如何为您的 lambdas 创建唯一的 classes/structs
  • 作为一般观察,请尝试改掉使用引用自动捕获的习惯。在这种情况下,捕获的需求为零。在更一般的情况下,通过引用捕获所有内容可能会导致非常难以调试的事故。

标签: c++ lambda gdb


【解决方案1】:

lambda 表达式的类型是类类型,但它没有名称。该类最重要的特点是它有一个公共的operator(),因此可以在函数调用表达式语法中使用。

大量技术细节在标准部分[expr.prim.lambda.closure],以

开头

lambda-expression 的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型,称为 闭包类型 ,其属性如下所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多