Ho provato a racchiudere qualcosa di simile ai puntatori di dati condivisi di Qt per i miei scopi, e dopo aver provato ho scoperto che quando veniva chiamata la funzione const, la sua versione non const era scelto invece.Chiamare una funzione const piuttosto che la sua versione non costante
Sto compilando con C++ 0x opzioni, ed ecco un codice minimo:
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();
}
Come si può vedere, Data.x è una funzione const, quindi l'operatore -> dovrebbe essere chiamato il primo. E quando commento quello non const, si compila senza errori, quindi è possibile. Eppure le mie stampe terminali:
"dati PTR non const"
Si tratta di un bug di GCC (ho 4.5.2), o c'è qualcosa che mi manca?
in modo che il compilatore preferisca chiamare il sovraccarico non costante se l'oggetto non è dichiarato const, anche se potrebbe chiamare il sovraccarico const? – coyotte508
@ coyotte508: Precisamente. Il sovraccarico non-'' 'è considerato una corrispondenza migliore. –