La première forme signifie que le (l'état du) Circle
lié à la référence qui est le paramètre de l'objet copy()
ne sera pas modifiée par copy()
par le biais de cette référence. La référence est une référence à const
Il n'est donc pas possible d'invoquer les fonctions membres de l'EPC. Circle
à travers cette référence qui ne sont pas eux-mêmes qualifiés de const
.
La deuxième forme, par contre, est illégale : seulement fonctions membres peut être const
-qualifié (alors que ce que vous déclarez là est un global, friend
fonction).
Lorsque const
qualifie une fonction membre, la qualification se réfère à l'implicite this
argument. En d'autres termes, cette fonction ne sera pas autorisée à modifier l'état de l'objet sur lequel elle est invoquée (l'objet pointé par la fonction implicite this
) - à l'exception de mutable
objets, mais c'est une autre histoire.
Pour le dire avec un code :
struct X
{
void foo() const // <== The implicit "this" pointer is const-qualified!
{
_x = 42; // ERROR! The "this" pointer is implicitly const
_y = 42; // OK (_y is mutable)
}
void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
{
obj._x = 42; // OK! obj is a reference to non-const
_x = 42; // ERROR! The "this" pointer is implicitly const
}
void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
{
obj._x = 42; // ERROR! obj is a reference to const
obj._y = 42; // OK! obj is a reference to const, but _y is mutable
_x = 42; // OK! The "this" pointer is implicitly non-const
}
int _x;
mutable int _y;
};