En mi opinión, el siguiente código (de alguna pregunta de C++) debería conducir a UB, pero parece que no lo es. Aquí está el código:¿Llama explícitamente el resultado de destructor en Comportamiento indefinido aquí?
#include <iostream>
using namespace std;
class some{ public: ~some() { cout<<"some's destructor"<<endl; } };
int main() { some s; s.~some(); }
y la respuesta es:
some's destructor
some's destructor
aprendí forma de C++ FAQ Lite que no hay que llamar explícitamente a destructor. Creo que después de la llamada explícita al destructor, el objeto s debe ser eliminado. El programa vuelve a llamar al destructor automáticamente cuando termina, debe ser UB. Sin embargo, lo probé en g ++ y obtuve el mismo resultado que la respuesta anterior.
¿Es porque la clase es demasiado simple (no involucra nuevo/eliminar)? ¿O no es UB en absoluto en este caso?
El punto del * comportamiento indefinido * es que está ** indefinido **. El hecho de que "funcione" es solo una de las infinitas posibilidades. – ereOn
Este destructor es demasiado simple para tener efectos nocivos. Creo que llamar al destructor no es un caso especial, sino simplemente llamar a un método de la clase. Tiene el caso especial de ser llamado justo antes de ser desasignado (desde eliminar o salir del alcance). –
@ereOn: Gracias. Entiendo que "funciona" en g ++ no significa que no esté "indefinido". Sin embargo, la respuesta en línea (que podría no ser correcta) NO es UB, es por eso que estoy confundido. – EXP0