лямда-захват

Предположим, я иметь следующую структуру :

struct A {    A() { std::cout << "default constructor" << std::endl; }    A(const A&) { std::cout << "copy constructor" << std::endl; }    A(A&&) { std::cout << "move constructor" << std::endl; }    ~A() {std::cout << "deleting" << std::endl; }    void update() { std::cout << "updating" << std::endl;}};

У меня есть обобщенная функция, которая будет взаимодействовать со ссылкой на :

void sync_process(A&) {    /// ...}

Я хочу, чтобы обрабатывать экземпляр в другом потоке. Вот код, который я использую (в основном) :

struct B {    std::list<std::thread> threads;    ~B() {        for(std::thread& th : threads)            th.join();    }    void thread_process(A& a) {        // call sync_process in another thread for a copy of A    }};

И основной код будет что-то вроде этого :

    B b;    {        A a;        b.thread_process(a);    }
athread_process

Обратите внимание, что могут быть удалены только после вызова .

Попытка 1

Я впервые попробовал что-то вроде этого :

threads.emplace_back([=]{sync_process(a);});
aconst A

Я ожидал захвата позволите воспользоваться ссылкой, учитывая, что я получил мою собственную копию . Но я был удивлен, чтобы получить вместо этого в результате следующей ошибки :

// invalid initialization of reference of type 'A&' from expression of type 'const A'

Попытка 2

A cpy(a);threads.emplace_back(&sync_process, std::move(cpy));
no type named 'type' in 'class std::result_of<void (*(A))(A&)>'sync_process

В этот раз : эта странная ошибка появляется . Однако, используя постоянную ссылку на предотвратить эту ошибку.

Попытка 3

threads.emplace_back([&]{A cpy(a); sync_process(cpy);});

На этот раз, я делаю копию в потоке. Но у меня не будет никаких гарантий, что мой объект все еще жив в этот момент, верно ?

Попытка 4

A* cpy = new A(a);threads.emplace_back([=]{sync_process(*cpy); delete cpy;});

ОК, это работает, но это не очень безопасно : исключения ...


<БР>

Так вот мои вопросы :

  • Why the lambda capture "const-qualify" my object ?
  • What is the more elegant way to achieve this ? (store data with the thread, duplicate copies, ...)