Maison >développement back-end >C++ >Pourquoi ne puis-je pas créer des références non constantes à des objets temporaires en C ?

Pourquoi ne puis-je pas créer des références non constantes à des objets temporaires en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 11:59:10692parcourir

Why Can't I Create Non-Const References to Temporary Objects in C  ?

Comprendre les restrictions sur les références aux objets temporaires

En C , l'interdiction des références non const aux objets temporaires a suscité des spéculations sur son raisonnement. Bien que les explications courantes citent des dangers associés à la modification d'objets temporaires, un examen plus nuancé s'impose.

Considérons l'exemple suivant :

String& a = String("test"); // Error

Cette affectation génère une erreur, empêchant la création d'un objet non temporaire. -const référence à un objet temporaire. À l'inverse, l'affectation de l'objet temporaire à une référence const est autorisée :

const String& a = String("test"); // Ok

La justification de cette restriction réside dans les pièges potentiels liés à la modification des paramètres de fonction. Supposons que les références aux temporaires soient autorisées :

void inc(double& x)
{ x += 0.1; }

int i = 0;
inc(i);

Dans ce scénario, la modification du paramètre de fonction x ne se reflétera pas dans la valeur réelle de i. Ce comportement inattendu peut conduire à des erreurs subtiles et est évité en interdisant les références non constantes aux objets temporaires.

Cependant, cette explication soulève la question : pourquoi autoriser la lecture à partir d'objets temporaires tout en restreignant l'écriture sur eux ? Si les objets temporaires sont supprimés après l'instruction, restreindre l'accès en lecture ne serait-il pas également logique pour atténuer les problèmes potentiels ?

La réponse réside dans les limitations techniques d'un compilateur. Lors du passage d'un objet temporaire par valeur, une copie doit être effectuée avant d'appeler la fonction. Pour les paramètres de référence, ce processus de copie est inutile ; au lieu de cela, la référence est directement liée à l'objet temporaire en mémoire. Autoriser l'accès en lecture aux objets temporaires permet d'exploiter cette technique pour plus d'efficacité.

Par conséquent, bien que la modification des objets temporaires soit interdite en raison d'erreurs potentielles dans les paramètres de fonction, autoriser l'accès en lecture à partir de références à ces objets offre des avantages en termes de performances sans introduire risques importants.

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