Конечно, выделение auto f = new std::function
в порядке. Определение лямбда *f = [f]() { delete f; };
также работает, поскольку оно еще не выполнено.
Теперь интересно (*f)();
. Сначала это разметки f
, затем вызывает operator()
и, наконец, выполняет delete f
. Вызов delete f
в функции члена класса function<>::operator()
совпадает с вызовом delete this
. При определенных условиях это законно.
Так что это зависит от того, как реализовано operator()
для std::function
и lamdabs. Ваш код будет действителен, если будет гарантировано, что никакая функция-член, переменная-член или этот указатель не будет использоваться или даже не затронут operator()
после выполнения вашей инкапсулированной лямбда.
Я бы сказал, что нет необходимости для std::function
вызывать другие функции-члены или использовать переменные-члены в operator()
после выполнения вашей лямбда. Таким образом, вы, вероятно, найдете реализации, для которых ваш код является законным, но в целом, вероятно, это небезопасно.
Это была моя ошибка ... На самом деле, вам нужно полное изложение даты [ГГГГ-ММ-ДДЧЧ: ММ: СС.МММЗ] Спасибо.