Maison > développement back-end > C++ > Pourquoi ne puis-je pas transmettre un objet temporaire à une référence non-const en C ?

Pourquoi ne puis-je pas transmettre un objet temporaire à une référence non-const en C ?

DDD
Libérer: 2024-12-10 22:29:10
original
246 Les gens l'ont consulté

Why Can't I Pass a Temporary Object to a Non-Const Reference in C  ?

Passer des objets temporaires en tant que références écarts

En C , les objets temporaires ne peuvent être transmis qu'à des références déclarées comme const, par valeur ou comme références rvalue. Cette restriction empêche toute modification accidentelle des temporaires, conduisant souvent à des erreurs d'exécution.

Erreur du compilateur

Considérez le code suivant :

class Foo {
public:
    Foo(int x) {};
};

void ProcessFoo(Foo& foo) {
}

int main() {
    ProcessFoo(Foo(42));
    return 0;
}
Copier après la connexion

Sous Linux et Mac, ce code ne parvient pas à se compiler avec l'erreur suivante :

error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
Copier après la connexion

Cette erreur provient du tenter de transmettre un objet Foo temporaire à un paramètre de référence non const, ce que C interdit.

Solutions de contournement

Pour résoudre ce problème, on peut utiliser les solutions de contournement suivantes :

  1. Créer un compte temporaire Variable :
Foo foo42(42);
ProcessFoo(foo42);
Copier après la connexion

Ici, une variable temporaire foo42 est créée et passée par référence.

  1. Pass by Const Reference :
void ProcessFoo(const Foo& foo)
Copier après la connexion

Cela permet de transmettre des objets temporaires en raison de la const qualificatif.

  1. Passage par valeur :
void ProcessFoo(Foo foo)
Copier après la connexion

Le passage par valeur copie le temporaire dans la fonction, contournant l'erreur.

Visual Studio contre g

Visuel Le comportement de Studio diffère de g dans ce cas. MSVC permet de transmettre des références temporaires à des références non constantes, introduisant potentiellement des problèmes d'exécution subtils. Ce comportement contraste avec g , qui adhère strictement à la norme C, interdisant de telles pratiques.

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