[C++] Errore di deduzione argomento modello durante il passaggio dell'indirizzo di tipo const


Answers

Poiché a viene dichiarato che viene passato per valore, nella deduzione argomento modello :

c) altrimenti, se A è un tipo cv-qualificato, i qualificati cv di livello superiore vengono ignorati per la deduzione:

Ciò significa, per go(x, &x); , per il primo argomento x , il parametro template T sarà dedotto come int , non const int . Per il secondo argomento T sarà dedotto come const int , perché b è dichiarato essere passato dal puntatore (e i qualificatori di cv sull'oggetto puntato sono riservati, lo stesso accade per il pass-by-reference). Quindi la deduzione fallisce.

A proposito: clang dà un messaggio abbastanza chiaro per questo:

prog.cc:4:3: nota: modello candidato ignorato: tipi in conflitto dedotti per il parametro 'T' ('int' vs. 'const int')

Question
template <typename T>
T go(T a, T *b){ T *t; return *t;}

int main() {
    const int x = 10;
    go(x, &x);
    return 0;
}

Fornisce l'errore del compilatore:

errore: nessuna funzione di matching per la chiamata a 'go (const int &, const int *)'

Perché il primo argomento è un tipo di riferimento const int& invece di solo const int ?

Per correggere questo errore di compilazione, ho annullato il processo di deduzione del compilatore specificando il tipo di argomenti go<const int>(x, &x); , ma ancora perché devo farlo?