首页 > 解决方案 > 分配给被移动的 std::function 是否合法

问题描述

以下代码是否合法:

std::function<void()> CreateFunction(int i, std::function<void()> previous_f) {
   return [i,previous_f] { 
     std::cout << i << std::endl;
     previous_f();
   };
}


int main()
{
  std::function<void()> f = []{};
  for(int i=0;i<3;++i) {
    f = CreateFunction(i, f);
  }
  f();
}

它按预期编译和运行 - http://cpp.sh/2smb3,但我担心在 f 移动后分配给 f 可能会调用未定义的行为。

标签: c++c++11stdmove

解决方案


由于您在 lambda 中按值捕获([i, previous_f]复制previous_f,与您传递的参数完全分离),因此它将是有效的。最后,f将(间接地,在 lambda 的上下文中)保存所有函数的副本。

请注意,您没有使用std::move. 但是,即使在这种情况下,当您制作不关心原件previous_f已被破坏的副本时,它仍然可以。


推荐阅读