Разница в том, что когда вы передаете функцию по значению, переданный в лямбду параметр является ссылкой на параметр функции , который выходит из области видимости при возврате decorator
. Когда вы позже вызываете возвращаемую лямбду, вы ссылаетесь на эту переменную вне области видимости, которая является неопределенным поведением.
Работает, когда вы передаете по универсальной ссылке, параметр, переданный в decorator
, является ссылкой, которая передается в лямбду. Так что это все еще в силе позже, когда вы называете лямбду.
Вы можете изменить лямбду, чтобы она передавалась по значению (используйте [=]
), чтобы заставить работать измененную версию.