Prueba el constructor de sintaxis catch

http://ideone.com/UtVzxw

struct base
{
    base() { throw std::exception(); }
};

struct derived : public base
{
    derived() try : base()  { }

    catch (std::exception& e)
    {
        std::cout << "exception handled" << std::endl;
    }
};

int main()
{
    derived a; // My app crashes.
    return 0;
}

¿Mi aplicación no escribe "excepción manejada" y continúa ejecutándose?

La única solución que he encontrado es rodear la construcción de "a"en un bloque try / catch. Pero si hago eso, ¿cuál es el punto de tener el try / catch en el constructor en primer lugar? Supongo que tal vez su uso sea limpiar las variables miembro que pueden haber sido asignadas? desde elincinerador de basuras&nbsp;no se llama?

Lo siguiente funciona, pero maneja la excepción 2 veces.

struct base
{
    base() { throw std::exception(); }
};

struct derived : public base
{
    derived() try : base() { }

    catch(std::exception& e)
    {
      std::cout << "exception 1" << std::endl;
    }
};

int main()
{
    // This works fine.
    try {
       derived a;
    }
    catch(std::exception& e)
    {
      std::cout << "exception 2" << std::endl;
    }
    return 0;
}

Solo intento preguntarme por qué no debería simplemente esquivar la sintaxis try / catch para el constructor y escribir esto:

struct base
{
    base() { throw std::exception(); }
};

struct derived : public base
{
    derived() : base() { }
};

int main()
{
    // This works fine.
    try {
       derived a;
    }
    catch(std::exception& e)
    {
      std::cout << "exception handled" << std::endl;
    }
    return 0;
}