Erreur : transmission d'un objet temporaire comme référence
En C, tenter de transmettre un objet temporaire en tant que référence non const peut rencontrer des erreurs de compilation . Cela se produit lorsqu'une fonction attend un paramètre de référence et est invoquée avec un objet temporaire.
Par exemple, considérons le code suivant :
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
Ce code se compile avec succès sur certains compilateurs, tels que Visual Studio, mais échoue avec des erreurs sur d'autres, tels que GCC. Le message d'erreur indique généralement une initialisation non valide du paramètre de référence non const à partir d'un type rvalue.
Solutions de contournement
Pour résoudre ce problème, il existe trois solutions de contournement courantes :
Créer une variable temporaire pour l'invocation de ProcessFoo :
Foo foo42(42); ProcessFoo(foo42);
Faire en sorte que ProcessFoo prenne une référence const :
void ProcessFoo(const Foo& foo) { }
Autoriser ProcessFoo à recevoir Foo par valeur :
void ProcessFoo(Foo foo) { }
Raisons de la compilation Erreurs
C interdit de passer un objet temporaire à une référence non const pour empêcher des opérations dénuées de sens. Une fonction qui prend une référence non const s'attend à modifier le paramètre et à le renvoyer à l'appelant. Passer un objet temporaire va à l'encontre de cet objectif car il ne peut pas être modifié ni renvoyé.
Différences de compatibilité
La raison pour laquelle le code d'origine est compilé sur Visual Studio mais pas sur GCC est probablement en raison de différences dans les configurations du compilateur. Visual Studio peut autoriser la transmission de valeurs temporaires à des références non const à titre d'optimisation ou de compatibilité ascendante. Cependant, les compilateurs C modernes préfèrent appliquer strictement la sémantique du langage, telle qu'implémentée dans GCC.
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!