从自身内部替换std :: function(通过将移动分配给* this?)

j00*_*0hi 4 c++ this-pointer move-semantics c++11 std-function

是否有可能将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();
}
Run Code Online (Sandbox Code Playgroud)

可以对其进行修改以进行编译吗?
现在的错误消息是:此lambda函数未捕获“ this” -我完全理解。我不知道,但是,我怎么能抓住functhis终场。我想,这甚至不是std::function lambda里面了吗?如何才能做到这一点?

背景:我要实现的目标如下:在给定的第一次调用中std::function,我想做一些初始化工作,然后用优化的函数替换原始函数。我想为我的功能用户透明地实现这一目标。

上面的示例的预期输出为:

a
b
b

Rak*_*111 5

您不能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
};
Run Code Online (Sandbox Code Playgroud)

但是请注意,如果func不首先调用它(有效地重新分配存储的函数对象)就让它的作用域超出了范围(例如,通过按值从函数返回它),那么您将得到一个悬空的引用。

我想,它甚至不在std::functionlambda里面了吗?

确实是。一个名字进入活动范围在其声明之后,因此前右=func类型std::function<void()>介绍。因此,在介绍lambda时,您已经可以捕获func