je suis tombé sur le code suivant récemment:Est-il légal/bien défini C++ d'appeler une méthode non statique qui n'accède pas aux membres via un pointeur nul?
class Foo
{
public:
void bar();
// .. other stuff
};
void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}
// .. do normal actions using data members
}
Le code compile car en C++ méthodes ne sont que des fonctions qui sont implicitement transmis un pointeur pour « ce » et « ce » peut être vérifié pour être NULL comme tout autre pointeur. De toute évidence, ce code est source de confusion et de mauvaise pratique, même s'il ne plante pas; Il serait assez déroutant de parcourir le code dans le débogueur, voir un pointeur NULL est sur le point d'avoir une méthode appelée et ensuite ne pas voir le plantage attendu. Ma question est: est-ce que cela viole la norme C++ pour appeler SomeFooPtr->bar()
où SomeFooPtr == NULL
? Il me vient à l'esprit que cela ne peut pas parce que l'opérateur défini par l'utilisateur -> renvoie un pointeur, ce qui signifie que même si ce pointeur est NULL, il n'a certainement pas été déréférencé (déréférencement d'un pointeur NULL par la norme comme illégale ou indéfinie). D'autre part, la sémantique des pointeurs bruts ne doit pas nécessairement correspondre à la sémantique des pointeurs définis par l'utilisateur - peut-être que l'opérateur-> est considéré comme un déréférencement même si le compilateur n'en génère pas.
Dupliquer: http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav – GManNickG