ejemplo destructores constructores c++ function parameters language-lawyer object-lifetime

c++ - destructores - ¿Cuál es el orden de destrucción de los parámetros de función?



constructores y destructores c++ pdf (1)

El punto exacto en el tiempo en el que se destruyen los parámetros no está especificado :

CWG decidió dejar sin especificar si los objetos de parámetros se destruyen inmediatamente después de la llamada o al final de la expresión completa a la que pertenece la llamada.

El orden en que se construyen los parámetros tampoco está especificado, pero debido a que los parámetros de función tienen alcance de bloque, aunque su orden de construcción no está especificado, la destrucción es en el orden inverso de construcción . Por ejemplo, considere

#include <iostream> struct A { int i; A(int i) : i(i) {std::cout << i;} ~A() {std::cout << ''~'' << i;} }; void f(A, A) {} int main() { (f(0, 1), std::cout << "#"); }

imprime 10#~0~1 con GCC y 01#~1~0 con Clang ; construyen parámetros en diferentes órdenes, pero ambos destruyen en el orden inverso de construcción, al final de la expresión completa se produce la llamada (en lugar de justo después de regresar a la persona que llama). VC ++ imprime 10~0~1# .

Este es un seguimiento de mi pregunta anterior. ¿ Cuál es el orden de destrucción de los argumentos de la función? porque accidentalmente confundí argumentos con parámetros. Gracias a Columbo y TC por eliminarme de la confusión terminológica en los comentarios de esa pregunta.

Si el cuerpo de alguna función f con los parámetros p_1 , ..., p_n de los tipos T_1 , ..., T_n respectivamente arroja una excepción, termina o regresa, ¿en qué orden se destruyen los parámetros y por qué? Proporcione una referencia al estándar, si es posible.

Ejemplos:

template <typename ... Args> void f(Args ... params) {} // in what order are params destroyed? void f(T1 p1, T2 p2, T3 p3) {} // in what order are p1, p2 and p3 destroyed?