Maison >développement back-end >C++ >Pourquoi ne puis-je pas transmettre un objet C temporaire à une référence non-const ?
Passer des objets temporaires comme références
En C , l'utilisation d'un objet temporaire comme référence peut conduire à un comportement inattendu. Pour éviter cela, le compilateur applique des restrictions sur le passage d'objets temporaires aux paramètres de référence.
Lors de la compilation du code fourni dans la requête initiale :
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) {}; int main() { ProcessFoo(Foo(42)); return 0; }
l'erreur se produit car le temporaire Foo(42 ) l'objet est transmis à un paramètre de référence non const (ProcessFoo(Foo& foo)). De par sa conception, C interdit cette pratique.
Solutions de contournement :
Les solutions de contournement suggérées atténuent le problème en :
Créer une variable temporaire : Assigner l'objet temporaire à une variable puis le passer en tant que référence :
Foo foo42(42); ProcessFoo(foo42);
Utiliser une référence Const : Modifier ProcessFoo pour prendre une référence const (ProcessFoo(const Foo& foo)), ce qui lui permet d'accepter des objets :
void ProcessFoo(const Foo& foo) {}; ProcessFoo(Foo(42));
En passant Valeur : Permettre à ProcessFoo de recevoir l'objet par valeur (ProcessFoo(Foo foo)), ce qui évite la restriction de référence :
void ProcessFoo(Foo foo) {}; ProcessFoo(Foo(42));
Différence de compilateur :
La différence de comportement entre Microsoft Visual Studio et GNU C (g ) est probablement due à des paramètres par défaut différents. Par défaut, g impose une conformité plus stricte à la norme C, tandis que Visual Studio peut autoriser certains écarts. Cela peut entraîner la génération d'erreurs dans un compilateur mais pas dans l'autre.
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!