la captura de los objetos de excepción por referencia, empleos temporales, problemas de toda la vida

StackOverflow https://stackoverflow.com/questions/1860064

  •  13-09-2019
  •  | 
  •  

Pregunta

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 es std::runtime_error("How long do I live?") un r-value?

¿Cómo es el objeto de excepción está todavía vivo en el bloque catch?

Donde exactamente son excepción los objetos almacenados?¿Qué es de su vida?

No hay solución correcta

Otros consejos

En el estándar de C++, párrafo 15.1.4:

La memoria para la copia temporal de la excepción es asignado en un indeterminado manera, excepto como se indica en 3.7.3.1. El temporal persiste mientras no se un controlador de ser ejecutado para que excepción.En particular, si una controlador de salidas mediante la ejecución de un tiro;la declaración, que se pasa el control a otro controlador para el mismo la excepción, por lo que el temporal sigue siendo.Cuando el último controlador de ser ejecutado para la excepción de las salidas por cualquier medio otro de tiro;el objeto temporal es destruido y la aplicación puede desasignar la memoria para la objeto temporal;cualquier desasignación se realiza en un indeterminado manera.La destrucción se produce inmediatamente después de la destrucción de el objeto declarado en el excepción a la declaración en el controlador.

Tenga en cuenta que, en C++estándar de hablar, un controlador de denotar un catch bloque con el correcto tipo de argumento.

Una excepción lanzada no es temporal - el código de excepción generado por el compilador guarda una copia permanente de la misma. Por lo que puede obligar a éste a una referencia no const.

[editar] Acabo de comprobar el nivel y en realidad se refiere a una copia temporal. Sin embargo, la vida útil del temporal se garantiza que sea al menos tan larga como la de la gestión de excepciones.

Como dijo Neil, hay magia interno del compilador pasando. Además, tenga en cuenta que se permite que el compilador para crear cualquier número de copias del objeto de excepción.

Kudos para tratar de comprender los detalles de la lengua. Al mismo tiempo, en mi humilde opinión, es mucho más importante para entender por qué debe capturar una excepción por referencia (y tirarlo por valor), que por qué puede .

Las personas suelen utilizar una jerarquía de clases de excepción, y la captura por referencia le permite aprovechar polimorfismo, y capturar una excepción de la clase base, cuando no hay necesidad de manejar tipos de excepciones individuales por separado. Si no pudo atrapar por referencia, se habría tenido que escribir una cláusula catch para cada posible tipo de excepción que puede ser lanzada en la cláusula try.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top