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 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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta