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; }
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’
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 :
Foo foo42(42); ProcessFoo(foo42);
Ici, une variable temporaire foo42 est créée et passée par référence.
void ProcessFoo(const Foo& foo)
Cela permet de transmettre des objets temporaires en raison de la const qualificatif.
void ProcessFoo(Foo foo)
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!