Lambda捕获列表和复制

时间:2013-01-23 13:12:35

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

1 个答案:

答案 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;
}