我有一个简单的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
它调用 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
798 次 |
| 最近记录: |