Por que chamar função de membro não virtual no ponteiro excluído é um comportamento indefinido?

Como diz o título:

Por que chamar função de membro não virtual no ponteiro excluído é um comportamento indefinido?

Observe que a pergunta não pergunta se é um comportamento indefinido, ele perguntaPor quê é um comportamento indefinido.

Considere oprograma seguinte:

#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;
}

No código acima, o compilador não desreferenciathis enquanto chama a função de membrodoSomething(). Note que a função não é uma função virtual e os compiladores convertem a chamada de função membro para uma chamada de função usual, passando isso como o primeiro parâmetro para a função (Pelo que entendi, esta é a implementação definida). Eles podem fazer isso porque o compilador pode determinar exatamente qual função chamar no próprio tempo de compilação. Então, praticamente, chamar a função de membro por meio de um ponteiro excluído não desreferethis. othis é desreferenciada somente se algum membro for acessado dentro do corpo da função (isto é, o código Uncommenting no exemplo acima que acessai)
Se um membro não for acessado dentro da função, não há propósito de que o código acima realmente chame um comportamento indefinido.

Então, por que o mandamento padrão de chamar a função de membro não virtual por meio de um ponteiro excluído é um comportamento indefinido, quando, na verdade, ele pode dizer com segurança que desreferenciandothis deve ser a declaração que deve causar um comportamento indefinido? É apenas por uma questão de simplicidade para os usuários da linguagem que o padrão simplesmente a generaliza ou há alguma semântica mais profunda envolvida neste mandato?

Meu sentimento é que, talvez, uma vez que é a implementação definida como os compiladores podem invocar a função de membro, pode ser que a razão pela qual o padrão não possa impor o ponto real em que o UB ocorre.

Alguém pode confirmar?

questionAnswers(4)

yourAnswerToTheQuestion