Jestem w sytuacji w środowisku wielowątkowym, w którym mam wątek, który odbiera dane z gniazda i chcę je wysłać do kolejki komunikatów.Czy możesz przechwytywać tablice w lambda?
Na przykład coś takiego:
char buf[N];
size_t len = ::recv(buf, ...);
queue.send([buf,len] {
//stuff
});
Ale to nie będzie działać, ponieważ buf
mógł wychodzić z zakresu lub nadpisane przez następne ::recv()
. Teraz MOŻE skopiować go do string
/std::vector
/cokolwiek i przekazać ŻE rzecz przez wartość:
char buf[N];
size_t len = ::recv(buf, ...);
std::string my_data(buf, len);
queue.send([my_data](){ /* stuff */ });
Ale ja poniesienia dodatkową kopię, prawda? Czy istnieje sposób na uzyskanie tej samej funkcjonalności bez dodatkowego obciążenia?
Dlaczego nie używasz 'std :: array'? Nie musisz przekazywać wartości, możesz przekazać przez referencję, tj. '[&]'. – Rapptz
'buf' może wyjść poza zakres, ale kopia w lambda nie będzie. Nadal możesz mieć dodatkową kopię, w zależności od tego, czy 'queue.send' jest zoptymalizowane do akceptowania referencji rvalue. –