Capturas de Lambda e variáveis ​​de membro

eu estava olhandoA palestra de Herb Sutter na conferência C ++ e Beyond 2012 sobre Concurrency e ele fala sobre a criação de uma classe wrapper sem bloqueio, que ele chamaconcurrent<T>, com funções C ++ 11.

Sua implementação é bastante simples (além de precisar deconcurrent_queue como o que existe no PPL da Microsoft):

template <class T>
class concurrent {
private:
    mutable T t;
    mutable concurrent_queue<std::function<void()>> q;
    bool done = false;
    std::thread thread;

public:
    concurrent( T t_ = T{} ) : t{t_}, thread{ [=]{ while( !done ) q.pop()(); }} {}

    ~concurrent() { q.push( [=]{ done = true; } ); thread.join(); }

    template <typename F>
    void operator()( F f ) const { q.push( [=]{ f(t); } ); }

};

Isso parece bastante simples, no entanto, estou confuso sobre por que ele capturou as variáveis ​​de membrodone eq por valor em vez de por referência? Meu entendimento é que, se eles forem capturados por valor, eles serão copiados para o encadeamento e, assim, quando a fila for atualizada, o encadeamento de trabalho não receberá as atualizações?

Eu entendi mal como o lambda captura o trabalho com relação às variáveis ​​dos membros da classe? Ninguém disse nada nos comentários para o vídeo ou durante a palestra, então estou supondo que o meu entendimento é defeituoso, caso em que alguém poderia esclarecer?

questionAnswers(1)

yourAnswerToTheQuestion