2013-08-16 9 views
15

Wenn ich bedenke, die beiden folgenden Überlastungen:universelle Referenz vs const Referenzpriorität?

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

ich die Garantie, dass f(x) wird die zweite Funktion jederzeit anrufen und wird nie zu einer Mehrdeutigkeit führen. In gewissem Sinne ist die zweite Version universell priorisiert im Vergleich zu der ersten für ein Argument, unabhängig von ihrem Typ.

Betrachten wir nun die Situation, wo es eine universelle Referenz und eine konstante Referenz Versionen einer Funktion:

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

Meine Frage ist: ist ihr eine universelle Priorität zwischen diesen beiden Funktionen unabhängig von der Art von x (R-Wert Referenz, Referenz, CV-Qualifier, Zeiger ...) wie im vorherigen Fall? (und wenn ja, was ist die Priorität?)

+2

Ich denke, es war [diese Diskussion] (http://www.youtube.com/watch?v=T5swP3dr190), die dies beinhaltete. – chris

Antwort

17

Zwischen diesen beiden Funktionen besteht keine universelle Priorität. Sie konkurrieren gleichermaßen im Überladungsauflösungsalgorithmus. Im Allgemeinen gewinnt die sogenannte "Universal Reference", es sei denn const T& ist eine exakte Übereinstimmung, und dort gewinnt die 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 
} 

Guter Rat ist zu nie Überlastung wie diese.

+0

Es könnte sich lohnen, zu erwähnen, welcher dieser Fälle (falls vorhanden) # 2 zu Beginn nie ein Kandidat war. –

+0

@BenVoigt Wenn ich etwas nicht vermisse, sind beide Überladungen in all diesen Ausdrücken möglich. – aschepler

+0

@aschepler: Ich denke du hast Recht. Vielleicht ist es "T &&" gegen "T &", was letztendlich überraschend ist. –