2016-06-08 8 views
9

Yerel bir değişkeni lambda ele geçirmeye çalışıyorum. Ben derlerkenC++ yakalama hareketi başlatıldı const?

#include <thread> 
#include <iostream> 

// Moveable but not copyable object. 
class WorkUnit 
{ 
    public: 
     WorkUnit(int)        {} 
     WorkUnit(WorkUnit&&)   noexcept {} 
     WorkUnit& operator=(WorkUnit&&) noexcept {return *this;} 
     WorkUnit(WorkUnit const&)     = delete; 
     WorkUnit& operator=(WorkUnit const&)  = delete; 

     // Non const function. 
     void doWork() 
     { 
      std::cerr << "Work\n"; 
     } 
}; 

int main() 
{ 
    WorkUnit data(4); 

    // Use C++14 generalized lambda capture. 
    std::thread test([data{std::move(data)}]() 
     { 
      // here it is complaining the `data` is a const value. 
      // Is there a way to capture this as a non const? 
      data.doWork(); 
     } 
    ); 
    test.join(); 
} 

Ben bu olsun.

> g++ -std=c++14 WU.cpp 
Test.cpp:26:13: error: member function 'doWork' not viable: 'this' argument has type 'const WorkUnit', 
     but function is not marked const 
      data.doWork(); 
      ^~~~ 

Yakalanan değerin const olmaması bekleniyordu.

+4

koyun 'mutable' sonra' [verileri = std :: hareket (veri)]()/* burada */{ ' –

+0

ya da referans ile bu yakalama '[& veri]() { veri .işi yapmak(); } '. – skypjack

+0

@PiotrSkotnicki Neden başlatıcıya burada izin verilmiyor? – songyuanyao

cevap

6

Sen mutable kullanabilirsiniz:

değişken - sağlayan vücut kopya tarafından yakalanan parametrelerini değiştirmek için, ve anahtar kelime mutable kullanıldı sürece onların const olmayan üye işlevlerini

aramaya lamda-ifadesi, işlev çağrısı işleci, kalifiye niteliklidir ve kopya tarafından yakalanan nesneleri, bu operator() içinden değiştirilemez.

std::thread test([data{std::move(data)}]() mutable 
    { 
     // the function-call operator is not const-qualified; 
     // then data is modifiable now 
     data.doWork(); 
    } 
); 
+0

Bu kopya değişebilir olmasını sağlar, orijinal değiştirmez. – Ajay

+0

@Ajay Evet, haklısın. OP'nin orijinal veriyi değiştirmek istemediğini, çünkü onu taşıdığını düşünüyorum. – songyuanyao