我有一个简单的代码:
#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并只有一个捕获对象的副本?
答案 0 :(得分:4)
有两个副本:一个用于将copy
复制到lambda中,另一个用于将lambda(具有Copy
成员)复制到std::function
。< / p>
如果您想要一个副本和一个移动,则需要使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;
}