C++ 什么';这个lambda函数的实际类型是什么?

C++ 什么';这个lambda函数的实际类型是什么?,c++,lambda,C++,Lambda,我有一个结合了3个lambda函数的代码: #include <functional> #include <iostream> using namespace std; template <typename F, typename G, typename H> auto concat(F f, G g, H h) { return [=](auto... parameters) { return f( g( h( parame

我有一个结合了3个lambda函数的代码:

#include <functional>
#include <iostream>
using namespace std;

template <typename F, typename G, typename H>
    auto concat(F f, G g, H h) {
    return [=](auto... parameters) {
        return f( g( h( parameters... ) ) );
    };
}

int main() {
    auto func1 (
        [](int i) {
            return (i * 2);
        }
    );

    auto func2 (
        [](int i) {
            return (i % 2);
        }
    );

    auto combined (
        concat(func1, func2, greater<int>{})
    );

    cout << combined(3, 2) << endl;

    return 0;
}
#包括
#包括
使用名称空间std;
模板
自动混凝土(F、G、H){
返回[=](自动…参数){
返回f(g(h(参数…));
};
}
int main(){
自动功能1(
[](国际一){
报税表(i*2);
}
);
自动功能2(
[](国际一){
回报率(i%2);
}
);
自动组合(
concat(func1,func2,大{})
);
cout来自:

lambda表达式是唯一的未命名非并集非聚合类类型的prvalue表达式,称为闭包类型,在包含lambda表达式的最小块作用域、类作用域或命名空间作用域中声明(用于ADL)

换句话说,每个lambda表达式都有一个唯一的未命名类型。
F
G
被推断为用于实例化模板的lambda类型。它不是函数指针

图解可以认为lambdas是函子的语法糖。

struct "no name" {
    auto operator()(int i) const {
        return (i * 2);
    }
);

每个lambda表达式都有一个未命名的唯一类类型,引用其类型的唯一方法是对其应用
decltype

在这个特定的
concat
实例化中,类型分别是
decltype(func1)
decltype(func2)
,和
greater


结果类型是
decltype(concat(func1,func2,greater{}))

在这种情况下,它们都是函数对象。但是,由于没有任何捕获的函数对象与函数指针等效,因此它们在这里或多或少是相同的。@super无捕获lambda可以转换为函数指针,但这并不能使它们等效。加上一个用于
decltype
的函数对象,不知怎的,我忘记了这一点,现在我不想从这个答案中窃取它;)谢谢@molbdnilo。有没有办法在标准
cout
中打印出
decltype(func1)
greater
?@dxfkgdkjfgbizldu你可以让编译器吐出一条提到lambda类型的错误消息,但不要期望太有意义的东西。例如