Le code fourni démontre le comportement inattendu où le nombre entier de type intégré est modifié dans la fonction Func, même bien qu'il soit transmis comme référence de valeur r en utilisant std::move. Ce comportement contredit la compréhension commune selon laquelle std::move transfère la propriété et les ressources.
La sémantique de déplacement fait référence au transfert de propriété et de ressources d'un objet à un autre. Dans ce contexte, les ressources sont les valeurs de données ou la mémoire allouée appartenant à un objet.
Les types intégrés, tels que les entiers, représentent eux-mêmes les ressources qu'ils prise. Il n’est donc pas logique de transférer la propriété de leurs ressources. Au lieu de cela, ils transmettent simplement la référence à l'objet, permettant aux modifications d'être reflétées dans l'objet d'origine.
std::move ne déplace pas réellement un objet . Son objectif est de convertir les références de valeur l (références à des objets avec des emplacements définis) en références de valeur x (références à des objets ayant expiré). Cette conversion permet à la référence de se lier aux références de valeur r dans la fonction de réception.
Après avoir appelé std::move sur un objet de type intégré, la référence est passée à la fonction fait toujours référence à l'objet d'origine. Toutes les modifications apportées à l'objet sont reflétées dans l'original.
Contrairement aux types définis par l'utilisateur, qui peuvent définir une sémantique de déplacement personnalisée, les types intégrés n'ont pas un tel comportement. std::move n'appelle aucun constructeur de déplacement ni opérateur d'affectation pour les types intégrés. Au lieu de cela, il les convertit simplement en références de valeur r à des fins de liaison. Ce comportement est bien défini par le standard C et explique la modification inattendue de num dans l'exemple de code donné.
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!