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!
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
.
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.