c++ - 返回带有移动捕获的 lambda 函数

标签 c++ lambda c++14

<分区>

我有一个函数可以构造一个带移动捕获的 lambda 函数(仅限 C++1y)并返回它。

#include <iostream>
#include <functional>
#include <memory>

using namespace std;

function<int ()> makeLambda(unique_ptr<int> ptr) {
    return [ ptr( move(ptr) ) ] () {
        return *ptr;
    };
}

int main() {
    // Works
    {
        unique_ptr<int> ptr( new int(10) );
        auto function1 = [ ptr(move(ptr)) ] {
            return *ptr;
        };
    }

    // Does not work
    {
        unique_ptr<int> ptr( new int(10) );
        auto function2 = makeLambda( std::move(ptr) );
    }

    return 0;
}

然而,似乎在返回时,unique_ptr<int>的复制构造函数被调用。为什么会这样/我怎样才能解决这个问题?

粘贴链接: http://coliru.stacked-crooked.com/a/b21c358db10c3933

最佳答案

问题是 std::function<int ()>返回类型,它试图制作 lambda 的拷贝。这将失败,因为复制构造函数由于 std::unique_ptr 的存在而被隐式删除。 .而不是将 lambda 存储在 std::function 中对象,使用返回类型推导,现在 lambda 将被移动。

auto makeLambda(unique_ptr<int> ptr) {
    return [ ptr( move(ptr) ) ] () {
        return *ptr;
    };
}

Live demo

您还应该更改 makeLambda 的参数类型至 unique_ptr<int>&&

关于c++ - 返回带有移动捕获的 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375342/

相关文章:

c++ - 通过 lambda 从 C++ 调用 C 回调函数

c++ - 将 std::unique_ptr<Derived> 转换为 std::unique_ptr<Base>

c# - 从 C# 调用 C++ DLib 导致错误分配异常

c++ - 有效 C++ : Item 41 - confusion about Implicit interfaces

lambda - 为什么Java 8中的lambda不允许对匿名类不允许的成员变量进行前向引用?

c++ - 将 lambda 绑定(bind)到函数以获得返回结果

c++ - 数组初始值设定项必须是初始值设定项列表或字符串文字,为什么?

c++ - 直接列表初始化和复制列表初始化之间的区别

c++ - 什么是游标链表? [C++]

c++ - 安装 VS2015 Update 3 后无法编译针对 WinXP 的新项目