initialize - En un objeto no constante, ¿por qué C++ no llama a la versión const de un método con sobrecargas public-const y private-nonstst?
initialize static member c++ (2)
class C
{
public:
void foo() const {}
private:
void foo() {}
};
int main()
{
C c;
c.foo();
}
A MSVC 2013 no le gusta esto:
> error C2248: ''C::foo'' : cannot access private member declared in class ''C''
Si lanzo a una referencia const
, funciona:
const_cast<C const &>(c).foo();
¿Por qué no puedo llamar al método const
en el objeto non const
?
De la norma:
13.3.3 Si existe una mejor función viable y es única, la resolución de sobrecarga tiene éxito y la produce como resultado. De lo contrario, la resolución de sobrecarga falla y la invocación está mal formada. Cuando la resolución de sobrecarga tiene éxito, y la mejor función viable no está accesible (Cláusula 11) en el contexto en el que se usa, el programa no está bien formado.
El objeto no es const
, por lo que la sobrecarga no const
es una mejor coincidencia. La resolución de sobrecarga ocurre antes de la verificación de acceso. Esto garantiza que la resolución de sobrecarga no se cambie inadvertidamente al cambiar el acceso de una función miembro.