¿Por qué es un comportamiento indefinido llamar la función miembro no virtual en el puntero eliminado?

Como dice el título:

¿Por qué es un comportamiento indefinido llamar la función miembro no virtual en el puntero eliminado?

Note que la pregunta no pregunta si es un comportamiento indefinido, preguntaPor qué Es un comportamiento indefinido.

Considera elsiguiente programa:

#include<iostream>
class Myclass
{
    //int i
    public:
      void doSomething()
      {
          std::cout<<"Inside doSomething";
          //i = 10;
      }
};

int main()
{
    Myclass *ptr = new Myclass;
    delete ptr;

    ptr->doSomething();

    return 0;
}

En el código anterior, el compilador en realidad no hace referenciathis mientras se llama función de miembrodoSomething(). Tenga en cuenta que la función no es una función virtual y los compiladores convierten la llamada de la función miembro a una llamada de función habitual pasándola como el primer parámetro a la función (como entiendo, esta implementación está definida). Pueden hacerlo porque el compilador puede determinar exactamente qué función llamar en el mismo tiempo de compilación. Así que prácticamente, llamar a la función miembro a través de un puntero eliminado no elimina la referenciathis. losthis se elimina la referencia solo si se accede a algún miembro dentro del cuerpo de la función (es decir: código de comentario en el ejemplo anterior que accede ai)
Si no se accede a un miembro dentro de la función, no tiene ningún propósito que el código anterior realmente deba invocar un comportamiento indefinido.

Entonces, ¿por qué el mandato estándar de que llamar a la función de miembro no virtual a través de un puntero eliminado es un comportamiento indefinido, cuando en realidad puede decir de manera confiable que no se hace referencia a lathis ¿Debería ser la declaración la que debería causar un comportamiento indefinido? ¿Es simplemente por simplicidad para los usuarios del lenguaje que el estándar simplemente lo generaliza o hay algo de semántica más profunda involucrada en este mandato?

Mi sensación es que tal vez ya que su implementación define cómo los compiladores pueden invocar la función miembro puede ser la razón por la cual el estándar no puede imponer el punto real donde ocurre la UB.

¿Alguien puede confirmar?

Respuestas a la pregunta(4)

Su respuesta a la pregunta