C++ 什么';这个lambda函数的实际类型是什么?
我有一个结合了3个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
#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类型的错误消息,但不要期望太有意义的东西。例如