En una función miembro no const de clase Foo
el puntero this
es del tipo Foo* const
- es decir, el puntero es const, pero no la instancia que apunta. En una función de miembro constante, sin embargo, el puntero this
es del tipo const Foo* const
. Esto significa que el objeto al que apunta también es constante.
Por lo tanto, en su ejemplo, cuando se utiliza this->m_bar
(de los cuales m_bar
es simplemente la forma corta), entonces m_bar
es un miembro de un objeto constante - por lo que no puede devolverlo como una referencia no const.
En realidad, esto tiene sentido desde un Punto de vista del diseño: Si eso Foo
objeto es un objeto constante, y se le permite invocar Foo::bar
de objetos constantes, entonces, si esto sería devolver una referencia no constante a algunos detalles internos las cuales se puede violín, sería capaz de cambiar el estado de un objeto constante.
Ahora tiene que mirar su diseño y preguntarse cómo llegó a este punto y cuál es su intención real. Si ese miembro m_bar
no es realmente parte del estado del objeto (por ejemplo, solo está allí para fines de depuración), entonces podría considerar hacerlo mutable
. Si es parte del estado del objeto, entonces debe preguntarse por qué desea devolver una referencia no constante a algunos datos internos de un objeto constante. Haga que el miembro funcione como no const, o devuelva una referencia constante, o sobrecargue la función de miembro:
class Foo {
public:
const QPoint& bar() const {return m_bar;}
QPoint& bar() {return m_bar;}
// ...
};
Gracias. Pensé que el calificador de función const estaba destinado a garantizar solo que la función en sí no modificará el objeto. Quiero que m_bar sea modificable, así que eliminé el calificador. – Dimitris
En realidad, evita que la función modifique el objeto, pero lo hace solo al entregar un objeto const a la función. Sin embargo, que la función para la cual no puede distribuir una referencia no constante es más que un efecto secundario accidental: no debería poder obtener referencias no constantes a un objeto constante de ninguna manera. – sbi