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?