可以换一个吗std::function
从自身内部与另一个std::function
?
以下代码无法编译:
#include <iostream>
#include <functional>
int main()
{
std::function<void()> func = []()
{
std::cout << "a\n";
*this = std::move([]() { std::cout << "b\n"; });
};
func();
func();
func();
}
可以修改一下编译吗?
现在的错误信息是:没有为此 lambda 函数捕获“this”- 我完全理解。但我不知道如何捕捉func
's this
-指针。我想,这甚至不是一个std::function
在 lambda 里面,还没?!如何才能做到这一点?
背景:我想要实现的目标如下:在第一次调用给定的std::function
,我想做一些初始化工作,然后用优化的函数替换原始函数。我希望为我的函数的用户透明地实现这一点。
上面示例的预期输出是:
a
b
b
你不能使用this
在 lambda 内部引用 lambda。this
只会引用封闭类,在你的情况下没有,所以你不能使用this
。然而你能做的就是捕捉func
并重新分配:
std::function<void()> func = [&func]()
{
std::cout << "a\n";
func = []() { std::cout << "b\n"; }; // note the missing move, a lambda
// is already an rvalue
};
但请注意,如果您让func
如果不先调用它(有效地重新分配存储的函数对象),那么它的作用域就超过了它的作用域(例如通过按值从函数返回它),那么您将获得一个悬空引用。
我想,这甚至不是一个std::function
在 lambda 里面,还没?!
确实如此。名称在其声明符之后进入作用域,因此在=
, func
类型的std::function<void()>
被介绍。因此,在引入 lambda 时,您已经可以捕获func
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)