В конечном счете, в этом вопросе есть много деталей, которые не актуальны. Мы можем свести его к вопросу о достоверности:
struct A {
something_unmovable m;
void operator()() {
delete this;
// do something with m
}
};
И спросить об этом. В конце концов, влияние resize()
заключается в вызове деструктора объекта mid-function-call.
Стандарт сообщает нам в [class.cdtor], что:
< blockquote>Для объекта с нетривиальным деструктором, ссылаясь на любой нестатический член или базовый класс объекта после завершения выполнения деструктора, приводит к неопределенному поведению.
blockquote> So если деструктор something_unmovable
является нетривиальным (что сделало бы деструктор A
- или ваш лямбда - нетривиальным), любая ссылка на m
после вызова деструктора - это неопределенное поведение. Если something_unmovable
имеет тривиальный деструктор, то ваш код вполне приемлем. Если вы не выполняете что-либо после delete this
(resize()
в своем вопросе), то это совершенно правильное поведение.
До сих пор доступен доступ из вектор?
blockquote>Да, функтор в
vec[0]
по-прежнему будет иметьm
. Это может быть оригинальная лямбда - или это может быть копия оригинальной лямбды. Но будетm
так или иначе.