3

我有一个简单的代码:

#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 不是选项。我的问题是:有没有办法用= capture list 存储 lambda 并且只有一个捕获对象的副本?

4

1 回答 1

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;
}
于 2013-01-23T13:25:06.963 回答