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回呼び出しますが、1回だけにしたいです。この単純化された例では auto を使用できることは理解していますが、後で使用するために保存する必要があるため、auto はオプションではありません。そして私の質問:ラムダを=キャプチャリストで保存し、キャプチャされたオブジェクトのコピーを1つだけ持つ方法はありますか?

4

1 に答える 1

5

2つのコピーがあります。1つはラムダにコピーcopyするためのもので、もう1つはラムダ(Copyメンバーを持つ)がにコピーされるときに発生しstd::functionます。

1つのコピーと1つの移動が必要な場合は、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 に答える