C-内部替换std::function通过move-assignment到* this?如何实现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计496个文字,预计阅读时间需要2分钟。
当然可以,以下是简化后的内容:
能否用另一个std::function替换其中的一个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(); }
可以修改编译吗?
现在的错误信息是:这个lambda函数没有捕获’this’ – 我完全理解.但是,我不知道如何捕获func的指针.我猜,它甚至不是lambda中的std :: function,但是?!如何才能做到这一点?
背景:我想要实现的是:在第一次调用给定的std :: function时,我想做一些初始化工作,然后用优化的函数替换原始函数.我想为我的功能用户透明地实现这一点.
上面例子的预期输出是:
你不能在lambda中使用它来引用lambda.这只会引用封闭类,在你的情况下没有,所以你不能使用它.但你可以做的是捕获功能并重新分配:a
b
b
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::functioninside the lambda, yet?!
它实际上是.名称在其声明符后立即进入作用域,因此恰好在=,func类型std :: function< void()>之前.介绍.因此,在您引入lambda的时候,您已经可以捕获func了.
本文共计496个文字,预计阅读时间需要2分钟。
当然可以,以下是简化后的内容:
能否用另一个std::function替换其中的一个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(); }
可以修改编译吗?
现在的错误信息是:这个lambda函数没有捕获’this’ – 我完全理解.但是,我不知道如何捕获func的指针.我猜,它甚至不是lambda中的std :: function,但是?!如何才能做到这一点?
背景:我想要实现的是:在第一次调用给定的std :: function时,我想做一些初始化工作,然后用优化的函数替换原始函数.我想为我的功能用户透明地实现这一点.
上面例子的预期输出是:
你不能在lambda中使用它来引用lambda.这只会引用封闭类,在你的情况下没有,所以你不能使用它.但你可以做的是捕获功能并重新分配:a
b
b
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::functioninside the lambda, yet?!
它实际上是.名称在其声明符后立即进入作用域,因此恰好在=,func类型std :: function< void()>之前.介绍.因此,在您引入lambda的时候,您已经可以捕获func了.

