Maison > développement back-end > C++ > Pourquoi le passage d'un objet temporaire à une référence non-const échoue-t-il en C ?

Pourquoi le passage d'un objet temporaire à une référence non-const échoue-t-il en C ?

Patricia Arquette
Libérer: 2024-12-05 09:07:11
original
355 Les gens l'ont consulté

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

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

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

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 :

  • Créer une variable temporaire : Créez une variable non temporaire qui contient la variable temporaire objet avant de le passer à la fonction :
Foo foo42(42);
ProcessFoo(foo42);
Copier après la connexion
  • Utiliser une référence Const : Modifier la fonction pour prendre un paramètre de référence const :
void ProcessFoo(const Foo& foo)
Copier après la connexion
  • Passer par valeur : Autoriser la fonction à prendre l'objet comme valeur paramètre :
void ProcessFoo(Foo foo)
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal