Maison >développement back-end >C++ >Le comportement « int x = x ; » est-il indéfini en raison de la conversion Lvalue en Rvalue ?

Le comportement « int x = x ; » est-il indéfini en raison de la conversion Lvalue en Rvalue ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-17 00:45:24503parcourir

Is `int x = x;` Undefined Behavior Due to Lvalue-to-Rvalue Conversion?

Conversion Lvalue en Rvalue et comportement non défini en int x = x;

En C , la question de savoir si l'attribution d'une valeur non initialisée en soi constitue un comportement indéfini a été un sujet de débat. La norme (3.3.2) déclare que l'initialisation d'une variable avec elle-même, comme dans l'exemple int x = x;, peut conduire à des résultats inattendus.

Le nœud du problème réside dans l'exigence potentielle de lvalue- conversion en valeur dans de telles affectations. Supposons que le x de droite soit une variable automatique non initialisée avec une valeur indéterminée. Selon la norme (4.1), effectuer une conversion lvalue en rvalue sur une telle valeur entraîne un comportement indéfini.

Preuve de la conversion Lvalue en Rvalue

Malgré l'absence d'exigences explicites dans la norme, diverses implications suggèrent que l'intention première est que les opérateurs intégrés s'attendent à des valeurs pr par défaut. Par exemple, la norme note que les opérateurs d'affectation intégrés impliquent une conversion lvalue en rvalue pour l'opérande droit. D'autres dispositions indiquent également que la conversion lvalue en rvalue est généralement anticipée, sauf indication contraire explicite.

Extension de la conjecture aux initialiseurs

Bien que l'initialisation soit distincte de l'affectation, l'ambiguïté de la norme concernant les catégories de valeurs pourrait potentiellement s'étendre à ce domaine. Les preuves suggèrent que la spécification prévue est d'attendre des prvalues ​​partout où une valeur est nécessaire.

Conséquences pour int x = x;

En supposant que la conjecture soit vraie, initialiser x avec lui-même nécessiterait une conversion lvalue en rvalue sur une valeur non initialisée, conduisant à un résultat indéfini comportement.

Preuves à l'appui

D'autres preuves découlent de la prise en compte du code qui attribue des variables non initialisées avec différents types et différentes affectations. Un comportement incohérent, tel que le fait d'empêcher la conversion de lvalue en rvalue lors de l'initialisation de la référence mais de l'autoriser lors de l'initialisation de l'objet, ajoute du crédit à l'idée selon laquelle la conversion de lvalue en rvalue est attendue pour l'initialisation par copie.

De plus, un Le rapport de défauts vise à introduire un langage explicite redéfinissant les valeurs d'objet de "non initialisé" à "valeur indéterminée" dans le contexte d'un comportement non défini lors de la conversion lvalue en rvalue. Cela suggère l'intention d'établir un comportement indéfini dans des cas comme int x = x;.

Conclusion

Sur la base des preuves présentées, il est raisonnable de conclure que la conversion lvalue en rvalue est requise dans l'initialisation int x = x;. Ceci, à son tour, conduit à un comportement indéfini en raison de la nature non initialisée du x de droite. Les incohérences de la norme et le besoin de clarification soulignent l'importance de spécifications détaillées pour les catégories de valeurs.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn