La detrazione per f1
e f2
non è corretta?Detrazione argomenti modello per pacchetto parametri funzione seguito da altri parametri
template<class... T, class U>
void f1(T..., U){}
template<class... T>
void f2(T..., int){}
int main()
{
f1(1);
f2(1);
return 0;
}
g ++ accetta sia, clang accetta solo f2
, e msvc respinge entrambi.
Related formulazione standard:
Quando un parametro funzione pack appare in un contesto non-dedotta ([temp.deduct.type]), il tipo di quel parametro pack è mai dedotto .
I contesti non dedotta sono:
- Un parametro pacchetto funzione che non si verifica alla fine del parametro di dichiarazione-list.
Quindi sembra che MSVC sia corretto nel respingere entrambi?
Significa che qualsiasi istanziazione dei modelli sarà mal formata, anche se si specifica esplicitamente il modello args?
f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?
Se questo è il caso, perché consentire tali dichiarazioni al primo posto?
Credo che la risoluzione è ancora imperfetta - un pacchetto di parametri è concettualmente infinito, non è possibile specificare esplicitamente * tutti * gli argomenti, il che significa che è sempre necessario dedurre i parametri e poiché si trova in un contesto non dedotto, il resto del pacchetto di parametri non viene mai dedotto. – Jamboree
@Jamboree Hai detto tu stesso "è un contesto non dedotto", tuttavia se specifichi esplicitamente gli argomenti del pacchetto non si verifica alcuna deduzione. – 101010
Sono considerati esplicitamente specificati: 'f1 <> (1); f2 <> (1); '? '' <> Fa qualche differenza qui? – Jamboree