Maison > développement back-end > C++ > le corps du texte

Pouvez-vous attribuer à une Rvalue de type classe en C ?

DDD
Libérer: 2024-10-28 09:26:29
original
664 Les gens l'ont consulté

 Can You Assign to an Rvalue of Class Type in C  ?

Affectation aux Rvalues ​​de type de classe

Vue d'ensemble

Dans le langage de programmation C, les rvalues ​​(valeurs de droite) ne peuvent généralement pas être utilisées comme lvalues ​​( valeurs de gauche). Il existe cependant des exceptions à cette règle, comme l'illustre le code suivant :

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>
Copier après la connexion

Étonnamment, ce code se compile avec succès, même si l'objet renvoyé par le constructeur Y(1) est une rvalue. Cet article explore les raisons de ce comportement inattendu.

Affectation aux valeurs R du type de classe

La clé pour comprendre pourquoi ce code est valide réside dans le concept de fonctions membres synthétisées. Pour les classes qui ne définissent pas explicitement un opérateur d'affectation, le compilateur génère un opérateur d'affectation par défaut. Cet opérateur par défaut est une fonction membre qui prend une référence à un objet de la même classe comme paramètre.

Dans l'exemple ci-dessus, l'opérateur d'affectation pour la classe Y est synthétisé comme suit :

<code class="cpp">Y& Y::operator=(const Y& other);</code>
Copier après la connexion

Notamment, cet opérateur d'affectation synthétisé est une fonction membre non const. Cela signifie qu'il peut être appliqué à la fois aux lvalues ​​(objets référencés) et aux rvalues ​​(objets non référencés).

Valeurs de retour du constructeur

Lorsqu'un objet est créé à l'aide d'un constructeur qui renvoie une rvalue, le le compilateur génère un objet temporaire en mémoire. Cet objet temporaire est automatiquement détruit à la fin de l'instruction dans laquelle il a été créé. Cependant, dans le cas où le constructeur renvoie une rvalue de type classe, l'opérateur d'affectation synthétisé peut prolonger la durée de vie de l'objet temporaire.

Syntaxe d'affectation

L'instruction d'affectation Y(1) = Oui(0); est du sucre syntaxique pour le code suivant :

<code class="cpp">Y(1).operator=(Y(0));</code>
Copier après la connexion

Comme nous l'avons établi, l'opérateur d'affectation synthétisé Operator= pour la classe Y est une fonction membre non const, ce qui signifie qu'il peut être appliqué à une rvalue. Par conséquent, le compilateur peut interpréter l'instruction d'affectation comme une affectation à l'objet temporaire créé par le constructeur Y(1).

Conclusion

Contrairement à ce qui est généralement attendu, il est possible d'attribuer à une rvalue de type classe en C car le compilateur synthétise des opérateurs d'affectation non const pour les classes sans opérateur d'affectation explicitement défini. Ces opérateurs d'affectation synthétisés prolongent la durée de vie des objets temporaires créés par les constructeurs, permettant des affectations à des 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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!