移动 lambda:一旦移动捕获了仅移动类型,如何使用 lambda? [复制]

2023-12-25

这个答案 https://stackoverflow.com/a/20669290/1858225解释了如何在 C++14 中移动捕获 lambda 中的变量。

但是一旦你移动捕获了一个不可复制的对象(例如std::unique_ptr)在 lambda 中,您无法复制 lambda 本身。

如果可以的话那就太好了movelambda,但在尝试这样做时出现编译错误:

using namespace std;

class HasCallback
{
  public:
    void setCallback(std::function<void(void)>&& f)
    {
      callback = move(f);
    }

    std::function<void(void)> callback;
};

int main()
{
  auto uniq = make_unique<std::string>("Blah blah blah");
  HasCallback hc;
  hc.setCallback(
      [uniq = move(uniq)](void)
      {
        std::cout << *uniq << std::endl;
      });

  hc.callback();
}

这会产生以下错误g++(我尝试仅复制相关行):

error: use of deleted function ‘main()::<lambda()>::<lambda>(const main()::<lambda()>&’

...我认为这意味着我移动 lambda 的尝试失败了。

clang++给出了类似的错误。

我明确尝试过moveing lambda(即使它是一个临时值),但这没有帮助。

EDIT:下面的答案充分解决了上述代码产生的编译错误。对于替代方法,只需release将唯一指针的目标值转换为std::shared_ptr, which can被复制。 (我不是把这个写成答案,因为那会假设这是一个 XY 问题,但根本原因是unique_ptr不能在转换为 a 的 lambda 中使用std::function理解这一点很重要。)

EDIT 2:可笑的是,我刚刚意识到auto_ptr据我所知,实际上会在这里做正确的事情(!)。它的作用本质上就像unique_ptr,但允许复制构造代替移动构造。


你可以移动拉姆达, 没关系。但这不是你的问题,你正在尝试实例化一个std::function带有不可复制的 lambda。还有:

template< class F > 
function( F f );

的构造函数function http://en.cppreference.com/w/cpp/utility/functional/function/function does:

5) 初始化目标copy of f.

这是因为std::function http://en.cppreference.com/w/cpp/utility/functional/function:

满足 CopyConstructible 和 CopyAssignable 的要求。

Since function必须是可复制的,你放入其中的所有内容也必须是可复制的。仅移动 lambda 不满足该要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动 lambda:一旦移动捕获了仅移动类型,如何使用 lambda? [复制] 的相关文章

随机推荐