Спецификация C ++ 0x определяет лямбды без сборки мусора. Короче говоря, спецификация допускает недетерминированное поведение в случаях, когда лямбда-замыкание содержит ссылки, которые больше не действительны. Например (псевдосинтаксис):
(int)=>int create_lambda(int a)
{
return { (int x) => x + a }
}
create_lambda(5)(4) // undefined result
Лямбда в этом примере относится к переменной (a
), которая размещается в стеке. Тем не менее, этот кадр стека был вытолкнут и не обязательно доступен после возврата из функции. В этом случае он, вероятно, сработает и вернет 9
в результате (при условии нормальной семантики компилятора), но нет способа гарантировать это.
Если вы избегаете сборки мусора, то я предполагаю, что вы также разрешаете явное распределение кучи и стека и (возможно) указатели. Если это так, то вы можете делать то же самое, что и C ++, и просто предполагать, что разработчики, использующие ваш язык, будут достаточно умны, чтобы выявлять проблемы с лямбдами и явно копировать их в кучу (точно так же, как если бы вы возвращали значение, синтезированное в функция).