c++ - 从自身内部替换 std::function(通过 move 赋值到 *this?)

标签 c++ c++11 move-semantics std-function this-pointer

是否可以用另一个 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 - 我完全理解。但是,我不知道如何捕获 functhis 指针。我想,它甚至不是 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/

相关文章:

c++ - 使用 ifstream 和 get() 从文件中获取一个字符串,用引号表示

c++ - 在 C++ 中即时添加过滤功能

c++ - 模板别名-问题(C++之旅)

c++ - 在 C++17 中使用容器时,noexcept move 操作是否有好处?

c++ - (N)RVO 的完整示例

c++ - 我在神经网络中实现反向传播时遇到问题

c++ - C++ 中的无符号算术

c++ - 获取包包

c++ - 具有可变模板参数的函数指针

c++ - 在移出 vector 上调用 size() 方法是否安全?