Lambda函数类型是什么?C++

4

请看我的代码:

#include <iostream>
#include <typeinfo>

int main() {
    auto x = [](int a, int b) -> bool{return a<b;};
    std::cout<<typeid(decltype(x)).name()<<std::endl;
}

这里打印的是 Z4mainEUliiE_,有人能解释一下吗?同时,x 的实际类型是什么?


它正在打印类型... - DeiDei
2
这是 decltype(x)。你为什么需要知道呢? - n. m.
请注意,如果您创建第二个接受(int,int)的lambda函数,无论返回类型或主体代码如何(假设在Linux/gcc下),它的名称将为Z4mainEUliiE0_。同样,第三个将获得1而不是0,... - Ruslan
1个回答

9

lambda表达式的实际类型被指定为“唯一闭包类型”。

它的名称未指定。甚至其布局也没有完全指定。它几乎完全是一个实现定义的类型,通常你不知道也不关心它的名称。

当你思考它时,你(开发者)真的不需要知道它的“实际名称”。你可以很好地引用它:

using my_lambda_type = decltype(x);

除了闭包类型是由实现定义的这一点之外,你要考虑的另一个方面是 std::type_info::name 的行为本身也是由实现定义的。你正在通过完全由实现定义的机制打印一种实现定义的名称以及与之相关的一些细节信息,而这些信息在 C++ 方面除了关于当前编译器实现的细节之外很少有什么可以推断出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接