Passer des objets temporaires comme références en C
En C , un extrait de code minimal tel que celui-ci peut provoquer des erreurs de compilation sous Linux et Mac plateformes :
class Foo { public: Foo(int x) {} }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
Compilation Erreur :
La compilation du code ci-dessus entraîne l'erreur suivante :
newfile.cpp: In function ‘int main()’: newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’ ProcessFoo(Foo(42)); ^ newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’ void ProcessFoo(Foo& foo)
Pourquoi l'erreur se produit :
De par sa conception, C interdit de passer un objet temporaire à un paramètre de référence non const. Cette restriction vise à éviter d'éventuels malentendus et erreurs. Lorsqu'une fonction déclare un paramètre de référence non const, cela signifie son intention de modifier l'objet et de le renvoyer à l'appelant. Passer un temporaire à un tel paramètre est illogique, car il sera détruit une fois la fonction renvoyée.
Solutions de contournement :
Pour résoudre cette erreur de compilation, envisagez les solutions de contournement suivantes :
Foo foo42(42); ProcessFoo(foo42);
void ProcessFoo(const Foo& foo)
void ProcessFoo(Foo foo)
Pourquoi MSVC l'autorise :
On ne sait pas pourquoi Microsoft Visual Studio (MSVC) autorise la compilation de ce code alors que g ne le fait pas. Potentiellement, MSVC a une interprétation différente de la norme C à cet égard. Il est généralement recommandé de suivre la norme pour garantir un comportement cohérent entre les différents compilateurs.
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!