Удаление объекта std :: function внутри себя

Это хорошо определенное поведение?

#include <functional>

void foo() {
    auto f = new std::function<void()>;
    *f = [f]() { delete f; };
    (*f)();
    f = nullptr;
}

int main() {
    foo();
}

Используя самый последний g ++, если я делаю это в шаблоне, это вызывает недопустимые чтения во время работы в valgrind, в противном случае он работает нормально. Зачем? Это ошибка в g ++?

#include <functional>

template<std::size_t>
void foo() {
    auto f = new std::function<void()>;
    *f = [f]() { delete f; };
    (*f)();
    f = nullptr;
}

int main() {
    foo<0>();
}

Ответы на вопрос(6)

Ваш ответ на вопрос