2016-03-27 30 views
5

Dato il seguente semplice structmodello variadic costruttore priorità

template <typename T> 
struct A 
{ 
    A(T a) {} 

    template <typename ... Ts> 
    A(T a, Ts ... more) {} 
}; 

int main() 
{ 
    A<int> a(1); 
} 

Qual è la garanzia che A(T a) sarà chiamato al posto del costruttore modello variadic, e perché?

risposta

6

La sezione nello standard che stai cercando è §14.8.2.4

Se A è stata trasformata da un pacco parametro di funzione e P non è un pacchetto di parametri, tipo la deduzione fallisce. Altrimenti, utilizzando i tipi risultanti P e A, la detrazione viene quindi eseguita come descritto in 14.8.2.5. Se P è un pacchetto di parametri di funzione, il tipo A di ciascun tipo di parametro rimanente del modello di argomento è confrontato con il tipo P del dichiaratore-id del pacchetto di parametri di funzione. Ogni confronto deduce gli argomenti del modello per le posizioni successive nei pacchetti di parametri del modello espansi dal pacchetto di parametri della funzione . Se la deduzione ha esito positivo per un determinato tipo, il tipo dal modello dell'argomento viene considerato come per essere specializzato almeno quanto il tipo dal modello di parametro.

[Esempio:

template<class... Args> void f(Args... args); // #1 
template<class T1, class... Args> void f(T1 a1, Args... args); // #2 
template<class T1, class T2> void f(T1 a1, T2 a2); // #3 
f(); // calls #1 
f(1, 2, 3); // calls #2 
f(1, 2); // calls #3; non-variadic template #3 is more 
// specialized than the variadic templates #1 and #2 

- esempio fine]

+1

14.8.2.4 è di circa il confronto tra due modelli di funzione per vedere che è più specializzata. Ma una delle funzioni candidate in questo esempio non è affatto un modello di funzione. – aschepler

+0

@aschepler Stai dicendo che il compilatore non deve arrivare fino a questo punto, perché avere una funzione non modello che è una corrispondenza perfetta significa che non è nemmeno necessario iniziare la risoluzione del modello. Sono d'accordo. Ci sarà un'altra sezione che copre questo. –

2

Lo stesso motivo f(const int&) è una partita migliore rispetto f(const T&) quando T si può dedurre come int: A(int) è una funzione non-modello e A(int, Ts...) con Ts... dedotta come la lista vuota è una specializzazione di modello di funzione.

Problemi correlati