web-dev-qa-db-fra.com

à propos de la conversion c ++: aucune conversion connue pour l'argument 1 de «[some_class]» à «[some_class] &»

Je travaille sur C++ et j'ai eu une erreur dont je ne connaissais pas la raison exacte. J'ai trouvé la solution, mais je veux toujours savoir pourquoi.

    class Base
    {
        public:
               void something(Base& b){}
    };

    int main()
    {
        Base b;
        b.something(Base());
        return 0;           
    }

quand je compile le code, j'ai eu cette erreur suivante:

abc.cpp:12:20: error: no matching function for call to ‘Base::something(Base)’
abc.cpp:12:20: note: candidate is:
abc.cpp:6:7: note: void Base::something(Base&)
abc.cpp:6:7: note:   no known conversion for argument 1 from ‘Base’ to ‘Base&’

mais quand j'ai remplacé b.quelque chose (Base ()) en

Base c;
b.something(c);

l'erreur a disparu, je me demande pourquoi ??? ne sont-ils pas du même type? Peu importe la façon dont je l'écris, mais le sens devrait être le même ???

Merci les gars!

39
user430926

Vous passez ici un objet Base temporaire:

b.something(Base());

mais vous essayez de le lier à une référence de valeur non constante ici:

void something(Base& b){}

Ceci n'est pas autorisé en C++ standard. Vous avez besoin d'une référence const.

void something(const Base& b){}

Lorsque vous faites cela:

Base c;
b.something(c);

vous ne passez pas un temporaire. La référence non const se lie à c.

41
juanchopanza

Dans le premier cas, vous essayez de passer une référence (non-const) à un argument as temporaire à une fonction qui n'est pas possible. Dans le second cas, vous passez une référence à un objet existant qui est parfaitement valide.

2
Ivaylo Strandjev