Угловой метод $ q .catch () не работает в IE8

Как уже было описано в других ответах, лямбды представляют собой, по существу, синтаксический сахар для легкого создания типов, которые обеспечивают пользовательскую реализацию operator(). Вот почему вы можете даже писать лямбда-вызовы, используя явную ссылку на operator(), например: int main() { return [](){ return 0; }.operator()(); }. Те же правила для всех нестатических функций-членов также применяются к лямбда-телам.

И эти правила позволяют уничтожать объект во время выполнения функции-члена, если функция-член не использует this после. Ваш пример необычный, более распространенным примером является нестатическая функция-член, выполняющая delete this;. Это сделало его в FAQ на C ++ , объяснив, что это разрешено.

Стандарт позволяет это, не обращаясь к нему, насколько мне известно. Он описывает семантику функций-членов таким образом, который не полагается на объект, который не уничтожается, поэтому реализации должны быть уверены, что позволить функциям-членам продолжать выполнение, даже если объекты будут уничтожены.

Итак, чтобы ответить ваши вопросы:

Или это то, что этот указатель лямбда теперь недействителен (указывает на освобожденную память), поэтому никакие захваты лямбда не могут быть доступны, но если он запускает код, t использовать что-либо, что он захватывает, это не неопределенное поведение?

blockquote>

Да, в значительной степени.

Кроме того, в том случае, когда лямбда является подвижной, любой другой?

blockquote>

Нет, это не так.

Единственный раз, когда возможно перемещение лямбда, возможно, после перемещения лямбда. В вашем примере operator() продолжает выполняться на исходном перемещенном и затем уничтоженном функторе.

30
задан Benjamin Gruenbaum 2 August 2014 в 13:32
поделиться