James McNellis ’ respuesta realmente lo cubrió todo, pero no lo hace ’ lastimado (espero) con más explicaciones.
So.
Cuando llamas & hellip;
o.operator int()
& hellip; entonces la selección de sobrecarga depende completamente de constness de o
.
Nada más.
Para ver por qué, consideremos esta clase:
struct Bar
{
void f() {}
void f() const {}
};
Técnicamente estas funciones miembro no necesitan ser funciones miembro. Podrían haber sido elegidos para funciones autónomas. Pero entonces necesitan Bar
argumento:
struct Bar
{};
void f(Bar&) {}
void f(Bar const&) {}
Y es de esperar ahora es más fácil ver que cuando se hace
Bar o;
f(o);
entonces la primera función puede ser seleccionado. Y así es. Porque si se seleccionó la segunda función, nunca se podría obtener la primera. Porque si crea el objeto const
, rompería la corrección de const
para seleccionar el primero. Entonces, cuando el objeto es const
, solo se puede seleccionar el segundo, por lo tanto, cuando no es const
, se selecciona el primero.
En resumen, la única alternativa práctica a esta regla sería seleccionar siempre la segunda, lo que haría que la primera sea bastante inútil, ¿sí?
Saludos & hth.,
Incluso 'A' ser una pila/montón asignado objeto normal (no temporal), da el mismo resultado. – iammilind
Si el objeto no está const-calificado, la sobrecarga sin const es una mejor coincidencia durante la resolución de sobrecarga. ¿Hay alguna razón por la que esperas que este no sea el caso? –
Por qué me confundo es, incluso si 'foo()' recibe 'const int' y tenemos un' A :: operator const int() const; ', aún así va y elige el operador' A :: virtual int 'normal . – iammilind