Maison >développement back-end >C++ >Pouvez-vous attribuer à une Rvalue de type classe en C ?
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>
É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.
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>
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).
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.
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>
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).
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!