Подтвердить что ты не робот

Действительно ли это для лямбда, по сути, закрывать себя?

Является ли эта регрессия лямбда действительной?

#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...?

4b9b3361

Ответ 1

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

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

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

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

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

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