Maison > développement back-end > C++ > Pourquoi pouvons-nous attribuer des valeurs R de type classe en C ?

Pourquoi pouvons-nous attribuer des valeurs R de type classe en C ?

Patricia Arquette
Libérer: 2024-10-29 13:58:02
original
953 Les gens l'ont consulté

 Why Can We Assign to Rvalues of Class Type in C  ?

Pourquoi l'affectation est-elle possible aux Rvalues ​​de type classe ?

En C, les affectations aux expressions rvalue ne peuvent généralement pas être effectuées. Cependant, ce comportement est apparemment violé dans l'extrait de code ci-dessous :

class Y {
public :
    explicit Y(std::size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // Assignment to rvalue
    return 0;
}
Copier après la connexion

Explication :

Contrairement aux attentes initiales, ce code se compile avec succès. La raison réside dans la synthèse implicite des fonctions membres, en particulier l'opérateur d'affectation. Selon la norme C (section 12.8 [class.copy], paragraphe 18), si un opérateur d'affectation n'est pas déclaré ou marqué comme supprimé, le compilateur en synthétise un. Pour le type de classe Y, l'opérateur d'affectation synthétisé aura les signatures suivantes :

  • Y& Y::operator=(Y const&)
  • Y& Y::operator=(Y&)

Notez que ces signatures n'incluent pas de qualificatif de référence (&) avant le paramètre. Par conséquent, l'opérateur d'affectation synthétisé est applicable aux expressions rvalue.

Ce comportement permet l'affectation à des objets temporaires créés en appelant le constructeur : Y(1).

Prévention de la gauche -Hand Side Temporary :

Pour éviter de créer un objet temporaire sur le côté gauche d'une mission, vous pouvez utiliser une technique appelée "copie élision". Cela implique de déclarer l'opérateur d'affectation avec un qualificatif ref, comme indiqué dans le code modifié suivant :

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator= (Y const&) & = default;
};
Copier après la connexion

Avec ce changement, l'opérateur d'affectation synthétisé ne sera plus applicable aux rvalues.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal