c++ - Lambda 捕获列表和复制

标签 c++ c++11 lambda

我有一个简单的代码:

#include <iostream>
#include <functional>

struct Copy
{
    Copy(){}
    Copy(const Copy&)
    {
        std::cout << "Copied!\n";
    }
};

int main() 
{
    Copy copy;
    std::function<void()> func = [=]{(void)copy;};
    return 0;
}

它调用了 copy-ctor 2 次,我只想调用它一次。我知道我可以在这个简化的示例中使用 auto,但我需要存储它以备后用,因此不能选择 auto。 我的问题是:有没有一种方法可以使用 = 捕获列表存储 lambda,并且只有一个捕获对象的拷贝?

最佳答案

有两种复制方式:一种是将 copy 复制到 lambda 中,另一种是在将 lambda(具有 Copy 成员)复制到 std::function

如果你想要一个拷贝和一个移动,你需要让Copy对象可以移动:

#include <iostream>
#include <functional>

struct Copy
{
    Copy(){}
    Copy(const Copy&)
    {
        std::cout << "Copied!\n";
    }
    Copy(Copy&&)
    {
        std::cout << "Moved!\n";
    }
};
//Prints:
//Copied!
//Moved!
int main()
{
    Copy copy;
    std::function<void()> func = [=]{(void)copy;};
    return 0;
}

关于c++ - Lambda 捕获列表和复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480559/

相关文章:

c++ - 通过引用传递数据成员

c++ - 从 double 创建 std::chrono::high_resolution_clock::time_point ?

c# - 将条件 lambda 语句与列表上的 foreach 操作一起使用

c++ - 消除对采用 std::functions 的函数的调用的歧义

c++ - 变量初始化,有什么区别?

c++ - 警告 - 从 size_t 转换为 DWORD,可能丢失数据

c++ - 在每次执行时设置模板代码的类型

c++ - Visual C++ 优化选项 - 如何改进代码输出?

c++ - 具有排序问题的结构的静态数据成员的命名空间

android - 代码在 lambda 表达式之外工作,但不能在内部工作