La primera forma significa que el (estado del) Circleobjeto vinculado a la referencia que es el parámetro de la copy()función no será alterado por copy()esa referencia. La referencia es una referencia a const, por lo que no será posible invocar funciones miembro de a Circletravés de esa referencia que no estén calificadas como const.
La segunda forma, por otro lado, es ilegal: solo las funciones miembro pueden ser const-calificadas (mientras que lo que está declarando es una friendfunción global ).
Cuando constcalifica una función miembro, la calificación se refiere al thisargumento implícito . En otras palabras, a esa función no se le permitirá alterar el estado del objeto en el que se invoca (el objeto al que apunta el thispuntero implícito ), con la excepción de los mutableobjetos, pero esa es otra historia.
Para decirlo con código:
struct X
{
void foo() const
{
_x = 42;
_y = 42;
}
void bar(X& obj) const
{
obj._x = 42;
_x = 42;
}
void bar(X const& obj)
{
obj._x = 42;
obj._y = 42;
_x = 42;
}
int _x;
mutable int _y;
};