Initialisation et conversion lvalue en rvalue
L'extrait de code fourni soulève un problème couramment débattu en C . L'initialisation d'une variable avec elle-même, comme dans int x = x;, implique une conversion lvalue en rvalue. La question se pose de savoir si cette conversion conduit à un comportement indéfini (UB) étant donné que le « x » de droite est une valeur non initialisée et que la conversion lvalue en rvalue sur des valeurs non initialisées est généralement interdite.
Preuve de la conversion attendue de lvalue en rvalue
Bien que la norme C 11 ne dispose pas d'une spécification explicite concernant les catégories de valeurs attendues par le langage constructions, des preuves circonstancielles suggèrent que les rvalues sont censées être l'attente par défaut.
Application à la conversion d'initialisation
Par analogie avec le comportement des opérateurs intégrés, il est raisonnable de supposer que l'initialisation par copie attend également un prvalue comme initialiseur. Cette hypothèse est en outre étayée par ce qui suit :
Implications pour l'extrait de code
En supposant que l'initialisation par copie attend une prvalue, l'extrait de code int x = x; conduirait en effet à l'UB. En effet, le « x » de droite est une lvalue non initialisée et sa conversion lvalue en rvalue donnerait une valeur indéterminée.
Preuves supplémentaires
Un rapport de défaut proposé souligne la nécessité de clarifier que la conversion lvalue en rvalue sur des objets avec une valeur indéterminée provoque une UB. Ce changement proposé soutient en outre l'idée selon laquelle l'initialisation par copie ne devrait pas permettre de telles conversions.
Conclusion
Sur la base des preuves disponibles, il est très probable que int x = X ; constitue UB en C , car la conversion lvalue en rvalue sur le 'x' non initialisé est interdite. Cependant, il est important de noter que la norme ne contient pas de spécifications définitives sur les catégories de valeurs attendues, ce qui laisse place à un débat en cours.
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!