Рассмотрим:
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)
, вероятно, вызовет перераспределение вектора, что означает, что std::function
будет скопирован в новое место, а старые уничтожены. Но это происходит, пока старый все еще работает. Этот конкретный код работает, потому что лямбда ничего не делает, но я думаю, что это может легко привести к поведению undefined.
Итак, что именно происходит? Доступно ли m
из вектора? Или это то, что указатель this
лямбда теперь недействителен (указывает на освобожденную память), поэтому никакие захваты лямбда не могут быть доступны, но если он запускает код, который не использует ничего, что он захватывает, это не undefined поведение?
Кроме того, в том случае, когда лямбда может быть перемещена любым другим?