Используйте std :: atomi c в лямбда-выражении - PullRequest
0 голосов
/ 31 января 2020

Я хочу захватить std::atomic в лямбда-выражении. Время жизни переменной atomi c должно быть привязано к лямбде, поэтому я не могу захватить по ссылке, но хочу избежать выделения кучи.

Как я могу изменить следующий фрагмент кода, чтобы сделать его скомпилировать и вести себя как задумано?

#include <atomic>

int main()
{
    std::atomic_int a{42};
    auto check = [a] () mutable { return a.fetch_sub(1) == 1; };
    //            ^ error: call to deleted constructor of 'std::atomic_int'
}

1 Ответ

1 голос
/ 31 января 2020

Вы можете инициализировать захват напрямую и полагаться на C ++ 17 гарантированное копирование / перемещение:

#include <atomic>

int main()
{
    auto check = [a = std::atomic_int(42)]() mutable {
        return a.fetch_sub(1) == 1;
    };
}
...