2013-08-16 4 views
15

quando considero le due seguenti overload:riferimento universale vs priorità di riferimento const?

template <class... T> void f(const T&... x); 
template <class T> void f(const T& x); 

ho la garanzia che f(x) sarà sempre chiamare la seconda funzione e non potrà mai portare ad un'ambiguità. In un certo senso, la seconda versione ha la priorità universale rispetto alla prima per un argomento qualunque sia il suo tipo.

Ora consideriamo la situazione in cui v'è un riferimento universale e una versione di riferimento const di una funzione:

template <class T> void f(T&& x); 
template <class T> void f(const T& x); 

La mia domanda è: è la loro priorità universale tra queste due funzioni indipendentemente dal tipo di x (riferimento al valore r, riferimento, qualifiche cv, puntatore ...) come nel caso precedente? (e se sì, qual è la priorità?)

+2

Penso che fosse [questo discorso] (http://www.youtube.com/watch?v=T5swP3dr190) che includeva questo. – chris

risposta

17

Non esiste una priorità universale tra queste due funzioni. Sono ugualmente competitivi nell'algoritmo di risoluzione del sovraccarico. In generale, il cosiddetto "riferimento universale" vince a meno che lo const T& sia una corrispondenza esatta, e lì vince il const T&.

struct A {}; 

int 
main() 
{ 
    f(std::declval<A>()); // calls f<A>(A&&), #1 
    f(std::declval<const A>()); // calls f<const A>(const A&&), #1 
    f(std::declval<A&>()); // calls f<A&>(A&), #1 
    f(std::declval<A&&>()); // calls f<A>(A&&), #1 
    f(std::declval<const A&&>()); // calls f<const A>(const A&&), #1 
    f(std::declval<const A&>()); // calls f<A>(const A&), #2 
} 

Un buon consiglio è quello di mai sovraccarico come questo.

+0

Potrebbe valere la pena menzionare quale di questi casi (se ce ne sono) n. 2 non è mai stato un candidato per cominciare. –

+0

@BenVoigt A meno che non manchi qualcosa, entrambi i sovraccarichi sono fattibili in tutte queste espressioni. – aschepler

+0

@aschepler: Penso che tu abbia ragione. Forse è 'T &&' vs 'T &' che finisce per essere sorprendente. –

Problemi correlati