Maison >développement back-end >C++ >L'initialisation C nécessite-t-elle une conversion Lvalue en Rvalue ?

L'initialisation C nécessite-t-elle une conversion Lvalue en Rvalue ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 12:33:08813parcourir

Does C   Initialization Require Lvalue-to-Rvalue Conversion?

L'initialisation entraîne-t-elle une conversion de valeur L en valeur R ?

La norme C 11 reste ambiguë quant à savoir si l'initialisation nécessite une conversion de valeur L en valeur R. . Cependant, des preuves suggèrent que les rvalues ​​sont attendues en tant qu'opérandes dans les opérateurs intégrés, sauf indication contraire. Cette approche a été étendue au contexte des initialiseurs.

Conjecture : valeurs Pr attendues pour les valeurs

La spécification supposée est que les valeurs pr sont attendues partout où une valeur est nécessaire, y compris lors de l'initialisation. Cela implique qu'une conversion lvalue en rvalue est requise lors de l'initialisation d'un objet.

Conséquences de la conjecture

Si l'initialisation attend des valeurs pr, les événements suivants se produisent :

  • int x = x; subit une conversion lvalue en rvalue, conduisant à un comportement indéfini car x n'est pas initialisé.
  • Mauformisme pour un code comme int y = 0; int x = y;, où y est une lvalue.
  • Comportement incohérent, par ex. z = y étant un comportement indéfini mais z = x ne l'étant pas, en supposant que x == y.

Preuves supplémentaires

Les preuves supplémentaires à l'appui de cette conjecture comprennent :

  • Le paragraphe 8.5/16 de la Norme implique la nécessité de « conversions standard » mais ne le fait pas mentionner les conversions de catégorie.
  • Le paragraphe 4.1 mentionne un comportement non défini lors de l'application d'une conversion lvalue en rvalue à un objet non initialisé.
  • Un rapport de défaut propose de reformuler le paragraphe 4.1 pour inclure les objets avec des valeurs indéterminées, y compris les objets non initialisés. objets.

Conclusion

Sur la base des preuves fournies, l'interprétation la plus probable est que l'initialisation attend des prvalues, ce qui entraîne un comportement indéfini lors de l'utilisation de lvalues ​​non initialisées comme initialiseurs. . Cette interprétation s'aligne sur l'approche plus large consistant à attendre des valeurs r dans les opérateurs intégrés, sauf indication contraire.

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