递归lambda函数如何结束呢?
#include <cstdio>
auto terminal = [](auto term) // <---------+
{ // |
return [=] (auto func) // | ???
{ // |
return terminal(func(term)); // >---------+
};
};
auto main() -> int
{
auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
发布于 2018-04-19 08:35:39
这不是递归函数调用,请逐步查看它:
terminal(stdout)
- 这只是返回已捕获的lambda stdout
hello
执行lambda(func(term)
),将结果传递给terminal()
它,它只返回1中的lambda。world
,它与2相同,这次返回值被丢弃...发布于 2018-04-19 09:03:14
该调用本身不是递归的。它返回一个函数对象,如果调用它,将terminal
再次调用以生成另一个函数对象。
因此terminal(stdout)
返回一个函子捕获stdout
并可以被另一个函数对象调用。再次调用它,用捕获的术语(hello)
调用hello
函子stdout
,输出"Hello"
; 调用terminal
并返回另一个函子,这次捕获返回值hello
- 这仍然是stdout
。调用该仿函数,(world)
再次输出"World"
。
https://stackoverflow.com/questions/-100008180
复制相似问题