En primer lugar, tenga en cuenta que el operador ->
de auto_ptr
esencialmente se reenvía al puntero contenido.Así que para esta discusión, el código en main
hace equivalente a:
MyClass* ptr = NULL;
cout << ptr->solution() << endl;
A continuación, tenga en cuenta que los compiladores tienden a poner en práctica las funciones miembro de una manera que actúan muchísimo funciones que no son miembros como si fueran la this
puntero pasado como otro argumento de función. Por lo tanto, desde el punto de vista de su compilador actual, su código en main
actúa como si fuera:
MyClass* ptr = NULL;
cout << solution(ptr) << endl;
con solución escribirse como:
int solution(MyClass* this) { return 42; }
En este caso se hace evidente por qué no había una choque.
Sin embargo como ya se ha mencionado, estos son detalles internos de cómo poner en práctica los compiladores de C++, que no están especificados por el estándar del lenguaje. Entonces, en teoría, este código podría funcionar como se describe aquí en un compilador, pero fallar o hacer algo completamente diferente en otro compilador.
Pero en la práctica, incluso si el estándar no garantiza este comportamiento, cualquier compilador particular podría garantizarlo si así lo desean. Por ejemplo: dado que MFC se basa en este comportamiento, es muy poco probable que Visual Studio deje de admitirlo alguna vez. Por supuesto, tendrías que investigar cada compilador particular donde tu código podría ser usado para asegurarte de que realmente garantizan este comportamiento.
Mi consejo sería consultar la "Guía del autoestopista galáctico". – NoMoreZealots