Почему замыкания в C ++ 11 и PHP требуют объявления закрытых переменных? - PullRequest
7 голосов
/ 21 октября 2011

Функциональные литералы как в C ++, так и в PHP требуют, чтобы программист указывал, какие переменные они используют из текущего лексического контекста.В чем причина этого требования?

Я предполагаю, что оно не предназначено для компилятора / интерпретатора, потому что можно статически вывести эту информацию из тела функционального литерала.Это только для привлечения внимания читателя?

Ответы [ 2 ]

10 голосов
/ 21 октября 2011

Для C ++ 11, по крайней мере, [=] () {...} автоматически включит все и только те локальные переменные, которые использует тело функции.(Или, в равной степени, [&]...)

Вы можете указать отдельные переменные, которые будут захвачены по ссылке или по значению, если у вас есть какие-либо конкретные потребности, помимо этой универсальной.

В PHP переменныесоздаются, когда их имя используется впервые, поэтому я ожидаю, что объявление должно убедиться, что новые переменные не маскируют старые.Немного похоже на ключевое слово global.

0 голосов
/ 21 октября 2011

ну не могу сказать для php ни того, что я получил ваш вопрос на 100% - но ... в c ++ переменная всего участвует в закрытии лямбда-функцииглавная предпосылка этого состоит в том, что это может изменить свою ценность, будучи ссылкой.

...