2015-01-22 3 views
2

Как я могу использовать boost-поток с C++ 11 lambda?boost thread with C++ 11lambda

Следующий код не работает:

int sum; 
m_workerThread=new boost::thread([]() 
     { 
       for(int i=0;i<100;i++) 
       { 
        sum=sum+i; 
       } 
     } 
     ); 

Я получаю ошибку компиляции.

Error 4 error C3493: 'sum' cannot be implicitly captured because no default capture mode has been specified 

Как это исправить?

ответ

6

Согласно ошибке, просто нужно забрать sum. As-is, лямбда не знает, что такое sum:

m_workerThread = new boost::thread([&sum]() 
//         ^^^^ 
    { 
      for(int i=0;i<100;i++) 
      { 
       sum=sum+i; 
      } 
    } 
); 
+0

спасибо. В чем смысл захвата, и я могу видеть из других ответов, что [=], .. также доступно, что, если у меня есть класс и есть несколько переменных? – mans

+1

@mans '[=]' подразумевает неявное захват всех переменных по-значению, что здесь неверно, потому что вам нужно захватить по ссылке. Для этого '[&]' подразумевает неявное захват всех переменных по ссылке. Но всегда хорошо быть конкретным. – Barry

+0

Спасибо. Правильно ли я полагаю, что [&] означает, что сумма за пределами лямбда является обновлением, [=] означает, что значение суммы фиксируется при запуске, но не обновляется (например, передача суммы в функцию). есть ли у нас другой вариант? – mans

Смежные вопросы