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

Можете ли вы захватить массивы в лямбда?

Я в ситуации в многопоточной среде, где у меня есть поток, который получает данные из сокета, и я хочу отправить эти данные в очередь сообщений.

Например, что-то вроде этого:

char buf[N];
size_t len = ::recv(buf, ...);
queue.send([buf,len] {
    //stuff
});

Но это не сработает, так как buf может выйти из области видимости или перезаписать следующий ::recv(). Теперь я МОЖЕТ скопировать его в string/std::vector/все и передать эту вещь по значению:

char buf[N];
size_t len = ::recv(buf, ...);
std::string my_data(buf, len);
queue.send([my_data](){ /* stuff */ });

Но у меня есть дополнительная копия, верно? Есть ли способ получить такую ​​же функциональность без дополнительных накладных расходов?

4b9b3361

Ответ 1

Да, вы можете. В Стандарте говорится, что (5.1.2p21):

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

который дает понять, что лямбда может захватить массив копией.