captura de objetos de excepción por referencia, temporarios, problemas de por vida

Considere el siguiente código:

#include <iostream>
#include <stdexcept>

void foo()
{
    throw std::runtime_error("How long do I live?");
}

int main()
{
    try
    {
        foo();
    }
    catch (std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}

¿Por qué puedo capturar la excepción por referencia, no esstd::runtime_error("How long do I live?") un valor?

¿Por qué el objeto de excepción sigue vivo en el bloque catch?

¿Dónde exactamente se lanzan los objetos de excepción almacenados? ¿Cuál es su vida?

Respuestas a la pregunta(4)

Su respuesta a la pregunta