是否可以用另一个 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();
}
可以修改编译吗?
现在的错误消息是:'this' was not captured for this lambda function - 我完全理解。但是,我不知道如何捕获 func
的 this
指针。我想,它甚至不是 lambda 中的 std::function
吧?!如何做到这一点?
背景:我想要实现的是:在给定 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
如果没有先调用它(有效地重新分配存储的函数对象),它的作用域就会超出它的范围(比如通过按值从函数返回它),那么你将得到一个悬空引用。
I guess, it is not even a
std::function
inside the lambda, yet?!
原来如此。名称在其声明符之后进入作用域,即在 =
之前, func
类型 std::function<void()>
介绍。所以在你引入lambda的时候,你已经可以捕获func
了。 .
关于c++ - 从自身内部替换 std::function(通过 move 赋值到 *this?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50568739/