2015-01-18 12 views
9

I seguenti compilazioni in clang ma non in gcc:chiamata di funzione ambigui con due parametri confezioni

template <class... Ts, class... Args> 
void f(Ts&&..., Args&&...); 

int main() 
{ 
    f(); 
} 

Questo è l'errore che ottengo in GCC:

main.cpp: In function 'int main()': 
main.cpp:30:7: error: no matching function for call to 'f()' 
    f(); 
    ^
main.cpp:30:7: note: candidate is: 
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...) 
void f(Ts&&..., Args&&...) 
    ^
main.cpp:23:6: note: template argument deduction/substitution failed: 
main.cpp:30:7: note: candidate expects 1 argument, 0 provided 
    f(); 
    ^

Se do un argomento come f(0) quindi si compila con GCC ma non con Clang.

Errore con clang:

main.cpp:30:5: error: no matching function for call to 'f' 
    f(0); 
    ^
main.cpp:23:6: note: candidate function not viable: requires 0 arguments, but 1 was provided 
void f(Ts&&..., Args&&...) 
    ^
1 error generated. 

Se io do lo stesso numero di argomenti espliciti template come parametri di funzione, allora si compila con entrambi i compilatori (cioè f<int, int, int>(0, 0, 0)).

+8

Non vedo come dovrebbe funzionare. Se chiamate 'f (1, 2, 3, 4)' o anche 'f (1, 2, 3, 4)' - che sono 'Ts' e quali sono' Args' ? Come può il compilatore dire dove iniziano la prima e la seconda? Sono due e due, uno e tre, zero e quattro? –

+2

@IgorTandetnik Non mi aspettavo che qualcuno di loro funzionasse. –

+5

Invia un bug-report "accetta-non valido" a ciascuno. – Deduplicator

risposta

2

Il secondo parametro modello specifico Args è infatti dedotto:

Un pacchetto parametro di modello finale (14.5.3) non altrimenti dedotta sarà essere dedotta da una sequenza vuota di argomenti del template.

Tenendo conto di ciò, diventa anche chiaro che ad es. f<int>(0) è ben formato. Tuttavia, Ts non viene mai dedotto. [Temp.deduct.call]/1:

Quando un parametro funzione pack appare in un contesto non dedotta (14.8.2.5), il tipo di quel parametro pacco non è mai dedotto.

Si noti che la citazione precedente non si applica a Ts, in quanto non è finale. Pertanto, la deduzione pura fallirà sempre.

Problemi correlati