Dans le langage de programmation C, les RValues (valeurs à droite) ne peuvent généralement pas être utilisées comme lvalues (valeurs gauche). Cependant, il existe des exceptions à cette règle, comme illustré par le code suivant:
class Y {
public:
explicit Y(size_t num = 0) {}
};
int main() {
Y(1) = Y(0); // WHAT?!?
return 0;
}
Étonnamment, ce code compile avec succès, même si l'objet renvoyé par le constructeur y (1) est un 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 de 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'attribution par défaut. Cet opérateur par défaut est une fonction de membre qui prend une référence à un objet de la même classe que son paramètre.
Dans l'exemple ci-dessus, l'opérateur d'affectation pour la classe Y est synthétisé comme suit:
Y& Y::operator=(const Y& other);
non. 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
Syntaxe d'attribution
Y(1).operator=(Y(0));
Comme nous l'avons établi, l'opérateur d'attribution d'attribution synthétisé = pour la classe Y est une fonction de membre non-Const, ce qui signifie qu'elle peut être appliquée à un journal. Par conséquent, le compilateur peut interpréter l'instruction Affectation comme une affectation à l'objet temporaire créé par le constructeur y (1). Conclusion
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3