请看我的代码:
#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 的实际类型是什么?
lambda表达式的实际类型被指定为“唯一闭包类型”。
它的名称未指定。甚至其布局也没有完全指定。它几乎完全是一个实现定义的类型,通常你不知道也不关心它的名称。
当你思考它时,你(开发者)真的不需要知道它的“实际名称”。你可以很好地引用它:
using my_lambda_type = decltype(x);
std::type_info::name
的行为本身也是由实现定义的。你正在通过完全由实现定义的机制打印一种实现定义的名称以及与之相关的一些细节信息,而这些信息在 C++ 方面除了关于当前编译器实现的细节之外很少有什么可以推断出来。
decltype(x)
。你为什么需要知道呢? - n. m.(int,int)
的lambda函数,无论返回类型或主体代码如何(假设在Linux/gcc下),它的名称将为Z4mainEUliiE0_
。同样,第三个将获得1
而不是0
,... - Ruslan