Maison  >  Article  >  développement back-end  >  Comment résoudre les erreurs de liaison lors de l'initialisation de membres privés avec des références Lvalue non constantes ?

Comment résoudre les erreurs de liaison lors de l'initialisation de membres privés avec des références Lvalue non constantes ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 01:46:02295parcourir

 How to Resolve Binding Errors When Initializing Private Members with Non-Const Lvalue References?

Résolution des erreurs de liaison : conversion des références Lvalue en Rvalues

Lors de la construction d'objets avec des membres privés qui nécessitent des références lvalue non const dans leur constructeurs, comme dans le cas de Foo, il peut être difficile de transmettre des valeurs appropriées. La modification de la classe Foo n'est pas toujours réalisable et l'utilisation de pointeurs bruts n'est pas souhaitable.

Dans cette situation, l'erreur provient de la tentative de lier une référence lvalue de type 'int&' à une rvalue de type 'int' lorsque initialiser le membre privé 'f' de la classe Bar. Le constructeur Foo attend une variable nommée, pas une valeur temporaire, comme dans ce cas, où « genValue() » renvoie un entier.

Pour résoudre le problème, envisagez plutôt de transmettre l'argument au constructeur Foo par valeur. de référence. Ce faisant, une copie de l'entier renvoyé par « genValue() » est créée et affectée au membre « x » de l'objet Foo.

Voici le code corrigé :

<code class="cpp">class Foo {
public:
    Foo(int x) { // Pass by value
        this->x = x;
    }
private:
    int x;
};

class Bar {
public:
    Bar(): f(genValue()) { // Pass by value
    }
private:
    Foo f;

    int genValue() {
        int x;
        // do something ...
        x = 1;
        return x;
    }
};</code>

En passant la valeur de retour genValue() comme argument réel, le compilateur attribue la valeur de la variable temporaire au membre x de l'objet Foo. Cette approche évite l'erreur tout en conservant le comportement prévu.

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