En C , les membres statiques d'une classe sont accessibles via un pointeur nul sans invoquer un comportement non défini. Ce comportement, qui peut paraître surprenant, peut s'expliquer en examinant les définitions et la justification du langage.
Lors de l'accès à un membre de la classe via un pointeur nul, le comportement est bien- défini tant que l'évaluation de l'opérande ne nécessite pas l'identité du référent ou la valeur stockée. Par exemple, l'accès à une variable membre statique d->a évalue simplement l'expression *(d) pour obtenir la référence à l'objet, mais n'effectue pas d'opérations nécessitant l'initialisation du référent.
Cette évaluation Le processus est pris en charge par [expr.ref]/2, qui indique que d->a est converti en ((d)).a. L'évaluation de ((d)), représenté par *d, se déroule sans déclencher d'erreur car l'objet référencé par d n'est pas requis.
La norme C n'indique pas explicitement que l'indirection via un pointeur nul entraîne intrinsèquement un comportement indéfini. En fait, les numéros 232 et 315 du CWG suggèrent que la simple indirection n'est pas problématique.
Le principal argument en faveur de cette position réside dans l'existence de scénarios bien définis dans lesquels l'indirection via des pointeurs nuls est autorisée. Par exemple, [expr.typeid]/2 permet à typeid(*((A*)0)) de lever une exception bad_typeid, même si *d est évalué à null. Si une simple indirection invoquait UB, cette instruction ne serait pas bien définie.
Dans votre exemple,
<code class="cpp">int main() { demo* d = nullptr; d->fun(); std::cout << d->a; return 0; }</code>
le programme se compile et s'exécute sans erreurs car l’appel de fonctions membres statiques ou l’accès à des variables statiques ne nécessite pas l’identité du référent. Votre programme ne présente donc aucun problème inhérent ni comportement indéfini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!