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

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

DDD
Libérer: 2024-12-10 22:29:10
original
335 Les gens l'ont consulté

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

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

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

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 :

  1. Créer un compte temporaire Variable :
Foo foo42(42);
ProcessFoo(foo42);
Copier après la connexion

Ici, une variable temporaire foo42 est créée et passée par référence.

  1. Pass by Const Reference :
void ProcessFoo(const Foo& foo)
Copier après la connexion

Cela permet de transmettre des objets temporaires en raison de la const qualificatif.

  1. Passage par valeur :
void ProcessFoo(Foo foo)
Copier après la connexion

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!

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