Подтвердить что ты не робот

Лямбда-захваты и переменные-члены

Я смотрел беседу Herb Sutter на конференции С++ и Beyond 2012 на Concurrency, и он рассказывает о создании неблокирующего класса-оболочки, который он называет concurrent<T>, с функциями С++ 11.

Его реализация довольно проста (кроме необходимости , например, того, что существует в Microsoft PPL):

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); } ); }

};

Это кажется достаточно простым, однако я смущен тем, почему он захватил переменные-члены done и q по значению вместо ссылки? Я понимаю, что если они будут захвачены по значению, они будут скопированы в поток и, таким образом, когда очередь будет обновлена, рабочий поток не получит обновления?

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

4b9b3361

Ответ 1

Членские переменные никогда не могут быть записаны по значению. То, что захватывается по значению, - это неявный указатель this, используемый для доступа к ним. Таким образом, он захватывает указатель по значению, что означает, что он захватывает этот объект (и его членов) по ссылке.