Dlaczego wywołanie funkcji non virtual member na usuniętym wskaźniku jest niezdefiniowanym zachowaniem?

Jak mówi tytuł:

Dlaczego wywołanie funkcji non virtual member na usuniętym wskaźniku jest niezdefiniowanym zachowaniem?

Zauważ, że pytanie nie pyta, czy jest to niezdefiniowane zachowanie, pytaCzemu jest to niezdefiniowane zachowanie.

Weź pod uwagęnastępujący program:

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

W powyższym kodzie kompilator nie dereferencyjnythis podczas wywoływania funkcji członkadoSomething(). Zauważ, że funkcja nie jest funkcją wirtualną i kompilatory konwertują wywołanie funkcji składowej na zwykłe wywołanie funkcji, przekazując to jako pierwszy parametr funkcji (jak rozumiem, jest to zdefiniowane wdrożenie). Mogą to zrobić, ponieważ kompilator może dokładnie określić, którą funkcję wywołać w czasie kompilacji. Praktycznie więc wywołanie funkcji składowej przez usunięty wskaźnik nie wyłusczathis. Thethis jest wyłuskiwany tylko wtedy, gdy do ciała funkcji jest dostępny dowolny członek (np. kod odkomentowania w powyższym przykładzie, który uzyskuje dostępi)
Jeśli element nie jest dostępny w ramach funkcji, nie ma sensu, aby powyższy kod faktycznie wywoływał niezdefiniowane zachowanie.

Dlaczego więc standardowy mandat, że wywoływanie nie wirtualnej funkcji składowej przez usunięty wskaźnik jest zachowaniem niezdefiniowanym, w rzeczywistości może wiarygodnie powiedzieć, że dereferencjathis powinno być stwierdzenie, które powinno powodować niezdefiniowane zachowanie? Czy jest to po prostu dla uproszczenia dla użytkowników języka, który po prostu uogólnia go, czy też w tym mandacie zaangażowany jest głębszy semantyczny?

Mam wrażenie, że być może ponieważ implementacja definiuje sposób, w jaki kompilatory mogą wywoływać funkcję składową, może to być standard powodujący, że nie może wymusić rzeczywistego punktu, w którym występuje UB.

Czy ktoś może potwierdzić?

questionAnswers(4)

yourAnswerToTheQuestion