我有一个简单的代码:
#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/