Intenté ajustar algo similar a los punteros de datos compartidos de Qt para mis propósitos, y al realizar las pruebas descubrí que cuando se llamaba a la función const, su versión no const era elegido en cambio.Llamar a una función const en lugar de a su versión no const
Estoy compilando con C++ 0x opciones, y aquí es un código mínimo:
struct Data {
int x() const {
return 1;
}
};
template <class T>
struct container
{
container() {
ptr = new T();
}
T & operator*() {
puts("non const data ptr");
return *ptr;
}
T * operator->() {
puts("non const data ptr");
return ptr;
}
const T & operator*() const {
puts("const data ptr");
return *ptr;
}
const T * operator->() const {
puts("const data ptr");
return ptr;
}
T* ptr;
};
typedef container<Data> testType;
void testing() {
testType test;
test->x();
}
Como se puede ver, Data.x es una función constante, por lo que el operador -> llamada debe ser el const uno. Y cuando comento el no-const, se compila sin errores, por lo que es posible. Sin embargo, mis impresiones de terminales:
"PTR datos const no"
¿Es un error GCC (tengo 4.5.2), o hay algo que me falta?
por lo que el compilador preferirá llamar a la sobrecarga sin const si el objeto no se declara const, incluso si pudiera llamar a la const overload? – coyotte508
@ coyotte508: Precisamente. La sobrecarga sin '' contraste '' se considera una mejor coincidencia. –