Как уже было описано в других ответах, лямбды представляют собой, по существу, синтаксический сахар для легкого создания типов, которые обеспечивают пользовательскую реализацию operator()
. Вот почему вы можете даже писать лямбда-вызовы, используя явную ссылку на operator()
, например: int main() { return [](){ return 0; }.operator()(); }
. Те же правила для всех нестатических функций-членов также применяются к лямбда-телам.
И эти правила позволяют уничтожать объект во время выполнения функции-члена, если функция-член не использует this
после. Ваш пример необычный, более распространенным примером является нестатическая функция-член, выполняющая delete this;
. Это сделало его в FAQ на C ++ , объяснив, что это разрешено.
Стандарт позволяет это, не обращаясь к нему, насколько мне известно. Он описывает семантику функций-членов таким образом, который не полагается на объект, который не уничтожается, поэтому реализации должны быть уверены, что позволить функциям-членам продолжать выполнение, даже если объекты будут уничтожены.
Итак, чтобы ответить ваши вопросы:
Или это то, что этот указатель лямбда теперь недействителен (указывает на освобожденную память), поэтому никакие захваты лямбда не могут быть доступны, но если он запускает код, t использовать что-либо, что он захватывает, это не неопределенное поведение?
blockquote>Да, в значительной степени.
Кроме того, в том случае, когда лямбда является подвижной, любой другой?
blockquote>Нет, это не так.
Единственный раз, когда возможно перемещение лямбда, возможно, после перемещения лямбда. В вашем примере
operator()
продолжает выполняться на исходном перемещенном и затем уничтоженном функторе.