代码之家  ›  专栏  ›  技术社区  ›  Baiyan Huang

为什么std::function不能从lambda移动构造?[复制]

  •  4
  • Baiyan Huang  · 技术社区  · 6 年前

    我想创造一个 std::function std::函数 我有一个错误。

    例如:

    auto pi = std::make_unique<int>(0);
    
    // no problems here!
    auto foo = [q = std::move(pi)] {
        *q = 5;
        std::cout << *q << std::endl;
    };
    
    // All of the attempts below yield:
    // "Call to implicitly-deleted copy constructor of '<lambda...."
    
    std::function<void()> bar = foo;
    std::function<void()> bar{foo};
    std::function<void()> bar{std::move(foo)};
    std::function<void()> bar = std::move(foo);
    std::function<void()> bar{std::forward<std::function<void()>>(foo)};
    std::function<void()> bar = std::forward<std::function<void()>>(foo);
    

    我会解释为什么我要写这样的东西。我编写了一个UI库,类似于jQuery或JavaFX,允许用户通过传递来处理鼠标/键盘事件 s到具有以下名称的方法 on_mouse_down() , on_mouse_drag() , push_undo_action() 等等。

    很明显 std::函数 我想通过,应该理想地使用一个移动捕捉lambda表达式,否则我需要诉诸于“当我在C++ 11是标准时使用的lambda”的习惯用法:

    std::function<void()> baz = [q = pi.release()] {
        std::unique_ptr<int> p{q};
        *p = 5;
        std::cout << *q << std::endl;
    };
    

    注意打电话 baz 上面的代码中有两次是错误的。但是,在我的代码中,这个闭包保证只被调用一次。

    顺便说一句,在我的真实代码中,我不会传递 std::unique_ptr<int> ,但更有趣的是。

    最后,我使用Xcode6-Beta4,它使用以下版本的clang:

    Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
    Target: x86_64-apple-darwin13.3.0
    Thread model: posix
    
    0 回复  |  直到 8 年前