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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-11-29 21:01:13668parcourir

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

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!

Déclaration:
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