tipos referencia por paso pasar parametros funciones ejercicios ejemplos dev codigos basicas arreglo c++ exception-handling

paso - pasar arreglo por referencia c++



Lanzar un argumento temporal pasado por referencia (1)

inline void my_assert( bool cond, const std::exception &e = my_assert_failed() ) { if ( !cond ) throw e; }

El estándar asegura que:

Un límite temporal a un parámetro de referencia en una llamada a función (5.2.2) persiste hasta la finalización de la expresión completa que contiene la llamada.

Y para un objeto temporal arrojado:

El temporal persiste siempre que se ejecute un controlador para esa excepción.

¿Puedo inferir que un temporal que se pasa a my_assert sobrevive hasta que finaliza el bloque catch?


Desde N4296 (primer borrador después de C ++ final 14) [15.1p3]:

Lanzar una copia de excepción: inicializa (8.5, 12.8) un objeto temporal, llamado objeto de excepción. El temporal es un valor l y se usa para inicializar la variable declarada en el controlador coincidente (15.3).

Entonces no puedes asumir que tu temporal "sobrevive al lanzamiento". Si se lanza, se llamará al constructor de copia de un objeto de excepción de tipo std::exception con e como argumento. El temporal al que e está obligado se destruirá cuando control deje la expresión completa que contiene la llamada a my_assert (ya sea después de un retorno normal o como parte del desenrollado de la pila, ya que está lanzando la excepción condicionalmente).

Hay circunstancias en las que se puede eludir la construcción de copia del objeto de excepción, pero este no es uno de ellos, de acuerdo con [12.8p31.2]:

- en una expresión de proyección (5.17), cuando el operando es el nombre de un objeto automático no volátil (que no sea una función o parámetro catch-clause ) cuyo alcance no se extiende más allá del final del try-block circundante más interno ( si hay uno), se puede omitir la operación copiar / mover del operando al objeto de excepción (15.1) construyendo el objeto automático directamente en el objeto de excepción

(énfasis mío)