c++ - 当我将 lambda 表达式复制到 std::function 时出了什么问题

标签 c++ lambda c++14 unique-ptr std-function

<分区>

代码会编译出错

class A
{

};

int main()
{
    auto a = std::make_unique<A>();
    std::function<void()> fun = [ap = std::move(a)](){

    };
}

但在我使用 auto 而不是 std::function 之后就没问题了

class A
{

};

int main()
{
    auto a = std::make_unique<A>();
    auto fun = [ap = std::move(a)](){

    };
}

错误是这样的:

C:/Qt/Qt5.11.1/Tools/mingw530_32/i686-w64-mingw32/include/c++/functional:1710:34: error: use of deleted function 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)'
    __dest._M_access<_Functor*>() =
                                  ^
C:\Users\Xiaopeng\CLionProjects\testGP\main.cpp:98:51: note: 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)' is implicitly deleted because the default definition would be ill-formed:
     std::function<void()> fun = [ap = std::move(a)](){
                                                   ^
C:\Users\Xiaopeng\CLionProjects\testGP\main.cpp:98:51: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete<A>]'
In file included from C:/Qt/Qt5.11.1/Tools/mingw530_32/i686-w64-mingw32/include/c++/memory:81:0,
                 from C:\Users\Xiaopeng\CLionProjects\testGP\main.cpp:3:
C:/Qt/Qt5.11.1/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/unique_ptr.h:356:7: note: declared here
       unique_ptr(const unique_ptr&) = delete;
   ^

当用户使用 std::function 时我的代码有什么问题?

最佳答案

std::function 要求存储在其中的可调用对象是可复制的。您的 lambda 不可复制,因为它包含仅移动数据成员。

第二个版本有效是因为它没有创建 std::function 对象,它使 fun 成为 lambda 的闭包类型(这是 lambda 的类型表达式本身)。

如果您需要将 lambda 存储在 std::function 中(例如,因为您需要将其存储在数据成员中),您将不得不以某种方式使其可复制。在您的情况下,最简单的解决方案是使用 std::shared_ptr 而不是 std::unique_ptr

关于c++ - 当我将 lambda 表达式复制到 std::function 时出了什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54034941/

相关文章:

c++ - 计算三角形与四边形的 TBN 矩阵的差异?

c++ - 从人 vector 插入和读取文件时出错

c++ - 当存在用户定义的移动分配运算符时,模板化的移动分配运算符被删除

java - 为什么 lambda 强制我使用单个元素数组而不是最终对象?

sql - 使用 Entity Framework 4.1 的多表连接,我应该使用 lambda 还是 LINQ?

c++ - 使用boost spirit X3解析变体列表

c++ - 将 Bimap boost 为 insert_or_modify

java - 在 java-8 lambda 表达式中使用 if-else 语句

c++ - 我可以确保对象在编译时只创建一次吗?

C++:重构管理命名空间