Rozważmy:Co się stanie, jeśli lambda zostanie przeniesiona/zniszczona podczas działania?
std::vector<std::function<void()>> vec;
something_unmovable m;
vec.push_back([&vec, m]() {
vec.resize(100);
// things with 'm'
});
vec[0]();
vec.resize(100)
prawdopodobnie spowoduje ponowny przydział wektora, co oznacza, że std::function
s zostaną skopiowane do nowej lokalizacji, a stare zniszczone. A jednak dzieje się tak, gdy stara nadal działa. Ten konkretny kod działa, ponieważ lambda nic nie robi, ale wyobrażam sobie, że może to łatwo doprowadzić do niezdefiniowanego zachowania.
Co się dzieje dokładnie? Czy m
jest nadal dostępny z wektora? Czy jest to, że wskaźnik lambda jest teraz niepoprawny (wskazuje na zwolnioną pamięć), więc nic z wychwytywania lambdy nie jest dostępne, ale jeśli uruchamia kod, który nie wykorzystuje niczego, co przechwytuje, nie jest to niezdefiniowane zachowanie?
Czy jest tak, że lambda jest ruchoma?
Czy "nieprzenośny" oznacza "nieopisywalny" lub jest "m" kopiowalny? (W powszechnym żargonie, jeśli coś jest do skopiowania, jest ono automatycznie przenoszone, ponieważ kopia jest prawidłową implementacją ruchu.) Nie można utworzyć lambda, która przechwytuje nieodwzorowaną wartość ([demo] (https://ideone.com/ MMW5sW)). –
Wziąłem "nieusuwalne", aby oznaczać tylko usunięty konstruktor ruchu z innymi domyślnymi. Możliwe jest zrobienie jednego z tych założeń. Myślę, że chodziło o pytanie, co dzieje się z zawartością przechwytywania lambda, gdy samo przechwycenie zostanie zniszczone. AFAIK, są traktowane tak samo jak konstrukcje. – defube