作者回复: 谢谢🙏。在这儿也顺祝所有的同学们新年好!😇🎈🎊
作者回复: 不是。你漏看了这句话:
“除非你用一个引用模板参数来捕捉函数类型,传递给一个函数的函数实参会退化成为一个函数指针。”
作者回复: 你如果不是频繁创建 function 对象的话,关系也不大吧。我觉得多考虑移动就行了。除非性能测试工具报告瓶颈就在这儿了,用智能指针去优化不太值(毕竟需要修改使用的代码)。
每个 lambda 都有自己的独特类型,每次定义相当于编译器帮你产生了一个函数对象(就像这一讲里定义的那些函数对象一样)。
具体如何实现,我倒没读到过相关的文章。你可以网上搜搜看,或者阅读标准库里的源码。
作者回复: 新年快乐。
对,概念上就是这样。
作者回复: 对,就是闭包。
Stackful 协程见 Boost.Coroutine2。Stackless 协程已经进入 C++20,第 30 讲讨论。🤓
新年快乐!
作者回复: libgo 我没有任何使用经验,不过,看起来它和大部分库实现的协程一样,都是 stackful coroutine。我第 30 讲会讲的是会进入 C++20 的 stackless coroutine。
每个 libgo 的协程都有自己的独立栈空间,因此,协程唤起和休眠时都需要进行栈切换。无栈协程则跟唤起者使用同一个栈。有栈的协程实现另外还有 libco、Boost.Coroutine2 等。
作者回复: 是说有线程的那个例子吗?我刚又试了,没问题的。
你是不是没有设定语言标准为 c++17?但你评论里又说设了……不设是确实不行的。
我编译的命令行是:
cl /EHsc /std:c++17 test16.cpp
如果你遇到错误了,又不贴出错误信息,别人也没法帮你啊……
作者回复: 就是让你想一想的呀。提示:按引用捕获的后果。
作者回复: lambda表达式的理解没啥问题。
int(int, int) 也是一个类型:一个接受两个整数参数、返回一个整数的函数。function 的主要复杂性,应该是需要处理函数、函数指针、函数对象等各种情况。函数对象的大小不确定,因而 function 需要在堆上分配内存。operator() 我记得相当于一个虚函数调用的复杂度。
作者回复: 不会。谈这个的书和文章够多了。
作者回复: 谢谢反馈。已更正。