Действительно ли лямбда действительно закрывается сама по себе? - PullRequest
43 голосов
/ 21 декабря 2011

Допустима ли эта лямбда-рекурсия?

#include <functional>
#include <iostream>

int main() {
   std::function<int(int)> g = [&g](int k) {
       return (k ? k * g(k-1) : 1);
   };

   std::cout << g(10); // 3628800
}

Она , кажется, компилируется и запускается нормально , но я нервничаю из-за закрытия над g в том же выражении, которое я инициализируюЭто.Строгий срок действия в масштабе 1-10 ...?

1 Ответ

22 голосов
/ 21 декабря 2011

В момент, когда вы фиксируете g по ссылке, оно было объявлено, поэтому имя доступно для использования:

3.3.2 / 1 Точка объявления именисразу после его полного декларатора (пункт 8) и до его инициализатора

Вы можете использовать объекты ограниченным образом до их инициализации - в основном, все, что не зависит от значения, в порядке:

3.8 / 6 до начала жизни объекта, но после того, как хранилище, которое будет занимать объект, было выделено [...] любое значение glvalue, которое ссылается на исходный объект, может использоваться, нотолько ограниченным образом.[...] использование свойств glvalue, которые не зависят от его значения, четко определено.

Итак, насколько я понимаю, то, что вы делаете, четко определено.

(Хотя, будучи ультрапедантичным, я не думаю, что он указан, когда выделено хранилище для автоматического объекта, и 8.3.2 / 5 говорит, что «ссылка должна быть инициализирована для ссылки на действительный объект» без определения «действительного»msgstr ", так что есть смысл утверждать, что это не очень четко определено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...