c – 从内部替换std :: function(通过move-assignment到* this?
发布时间:2020-12-16 09:20:51 所属栏目:百科 来源:网络整理
导读:是否可以用另一个std :: function替换其中的一个std :: function? 以下代码无法编译: #include iostream#include functionalint main(){ std::functionvoid() func = []() { std::cout "an"; *this = std::move([]() { std::cout "bn"; }); }; func(); f
是否可以用另一个std :: function替换其中的一个std :: function?
以下代码无法编译: #include <iostream> #include <functional> int main() { std::function<void()> func = []() { std::cout << "an"; *this = std::move([]() { std::cout << "bn"; }); }; func(); func(); func(); } 可以修改编译吗? 背景:我想要实现的是:在第一次调用给定的std :: function时,我想做一些初始化工作,然后用优化的函数替换原始函数.我想为我的功能用户透明地实现这一点. 上面例子的预期输出是:
解决方法
你不能在lambda中使用它来引用lambda.这只会引用封闭类,在你的情况下没有,所以你不能使用它.但你可以做的是捕获功能并重新分配:
std::function<void()> func = [&func]() { std::cout << "an"; func = []() { std::cout << "bn"; }; // note the missing move,a lambda // is already an rvalue }; 但请注意,如果你让func比它的范围更长(比如通过值从函数返回它)而不先调用它(有效地重新分配存储的函数对象),那么你将获得一个悬空引用.
它实际上是.名称在其声明符后立即进入作用域,因此恰好在=,func类型std :: function< void()>之前.介绍.因此,在您引入lambda的时候,您已经可以捕获func了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |