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
Patricia Arquetteoriginal
2024-10-29 13:58:02952parcourir

 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;
}

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;
};

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!

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