En primer lugar, para devolver una referencia que no es necesario utilizar el operador de signo en el objeto referenciado ; es necesario si desea obtener un puntero . Entonces, supongo que querías escribir return Bar;
.
Entonces, no, no puedes hacer eso; en un método const
usted tiene un puntero const
this
(en su caso sería un const Foo *
), lo que significa que cualquier referencia que pueda llegar a sus campos será una referencia const
, ya que usted está accediendo a ellos a través de un " const
ruta ".
Por lo tanto, si usted trata de hacer lo que hizo en ese código que obtendrá un error de compilación, ya que estaría tratando de inicializar un (el valor devuelto por el método) int &
con un const int &
(la referencia se obtener de Bar
), que obviamente está prohibido.
g ++ realidad dice:
testconstref.cpp: In member function ‘int& Foo::GetBar() const’:
testconstref.cpp:9: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘const int*’
que es lo que acabo de decir. :)
Si, en cambio, devuelve una referencia const
a un campo de clase de un método const
, no tendrá ningún problema.
- campos marcados como Excluyendo
mutable
, que le dice al compilador que tales campos son modificables incluso desde const
métodos; esta excepción se ha introducido para permitir que los métodos const
cambien el estado "real" del objeto en los casos en que esto no altere su estado "lógico"; Esto puede ser útil para poner en práctica la evaluación perezosa, recuento de referencias, ...
Creo que ya ha contestado a su pregunta. Además, en el ejemplo Bar ya es público. – XAder
'& Bar' tiene el tipo' const int * ', no' int & '. Tu compilador debería decirte que esto no está bien. –
¿Has probado compilar? ¿Qué te dijo el compilador? –