Почему вызов не виртуальной функции-члена для удаленного указателя является неопределенным поведением?

Как видно из названия:

Почему вызов не виртуальной функции-члена для удаленного указателя является неопределенным поведением?

Обратите внимание, что Вопрос не спрашивает, является ли это неопределенным поведением, он спрашиваетПочему это неопределенное поведение.

Рассмотримследующая программа:

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

В приведенном выше коде компилятор фактически не разыменовываетthis при вызове функции-членаdoSomething(), Обратите внимание, что функция не является виртуальной функцией, и компиляторы преобразуют вызов функции-члена в обычный вызов функции, передавая это в качестве первого параметра функции (насколько я понимаю, это определяется реализацией). Они могут сделать это, потому что компилятор может точно определить, какую функцию вызывать во время компиляции. Практически, вызов функции-члена через удаленный указатель не разыменовываетthis,this разыменовывается только в том случае, если к какому-либо члену обращаются внутри тела функции.i)
Если член не доступен в функции, нет никакой цели, что приведенный выше код должен фактически вызывать неопределенное поведение.

Так почему же стандартный мандат, согласно которому вызов не виртуальной функции-члена через удаленный указатель, является неопределенным поведением, хотя на самом деле он может достоверно сказать, что разыменованиеthis должно быть утверждение, которое должно вызывать неопределенное поведение? Это просто для простоты для пользователей языка, что стандарт просто обобщает его, или есть некоторая более глубокая семантика, вовлеченная в этот мандат?

Мне кажется, что, возможно, поскольку именно реализация определяется тем, как компиляторы могут вызывать функцию-член, это может быть причиной того, что стандарт не может обеспечить фактическую точку, в которой возникает UB.

Может кто-нибудь подтвердить?

Ответы на вопрос(4)

Ваш ответ на вопрос