Eliminar un objeto std :: function dentro de sí mismo

¿Es este comportamiento bien definido?

#include <functional>

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

int main() {
    foo();
}

Usando el g ++ más reciente, si hago esto dentro de una plantilla, causa lecturas no válidas mientras se ejecuta bajo valgrind, de lo contrario funciona bien. ¿Por qué? ¿Es esto un error en 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>();
}

Respuestas a la pregunta(6)

Su respuesta a la pregunta