Lambda 捕获列表和复制

ixS*_*Sci 3 c++ lambda c++11

我有一个简单的代码:

#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并且只有一个捕获对象的副本?

Man*_*rse 5

有两个副本:一个复制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)