【发布时间】:2021-01-03 01:03:35
【问题描述】:
我正在尝试学习 C++ 中的闭包。这个例子有效:
auto add_n(int n) {
return [=](int x) -> int {
return x + n;
};
};
auto add_3 = add_n(3);
add_3(5); //8
add_n 期望输出什么类型?我希望能够使用一个函数指针,它接受一个 int 并返回一个 int 作为返回类型?
typedef int (*fptr)(int);
fptr add_n(int n) {
return [=](int x) -> int {
return x + n;
};
};
此外,如果我改用模板,是否还需要做其他事情?谢谢!
【问题讨论】:
-
add_n的返回值是一些编译器生成的类类型,不能轻易命名(但可以通过decltype别名)。它不能是一个普通的函数指针——没有空间来存储捕获的n。 -
Lambda(或闭包)具有不可命名的类型。通常你不能明确地指定类型(除非 lambda 恰好没有捕获并且你的返回类型是相应的函数指针类型)。
-
“如果我使用模板而不是?”,不确定您将在何处以及如何添加模板,但从我认为可能的用途来看,我看不到额外的工作。
-
谢谢大家!如果没有捕获,它允许使用该语法,但似乎不太有用...@Jarod42 我在想
template <typename num> auto add_n(num n)与template <typename num> typedef num (*fptr)(num); fptr add_3() {之类的东西,但由于捕获的限制,第二个将毫无用处。跨度> -
唯一的规则是不捕获任何内容的 lambda 可以隐式转换为函数指针。但这并不意味着它 是 一个函数指针。如果它确实捕捉到了某些东西,那么,就没有这样的运气了。
标签: c++ pointers closures function-pointers return-type