Maison > développement back-end > C++ > Pourquoi le passage d'un objet temporaire en tant que référence non-const en C provoque-t-il des erreurs de compilation ?

Pourquoi le passage d'un objet temporaire en tant que référence non-const en C provoque-t-il des erreurs de compilation ?

DDD
Libérer: 2024-12-12 20:07:09
original
552 Les gens l'ont consulté

Why Does Passing a Temporary Object as a Non-Const Reference in C   Cause Compilation Errors?

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;
}
Copier après la connexion

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 :

  1. Créer une variable temporaire pour l'invocation de ProcessFoo :

    Foo foo42(42);
    ProcessFoo(foo42);
    Copier après la connexion
  2. Faire en sorte que ProcessFoo prenne une référence const :

    void ProcessFoo(const Foo& foo) {
    }
    Copier après la connexion
  3. Autoriser ProcessFoo à recevoir Foo par valeur :

    void ProcessFoo(Foo foo) {
    }
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal