La detrazione per auto
è uguale alla deduzione del modello. Da [dcl.spec.auto]:
Quando una variabile dichiarata utilizzando un tipo di segnaposto viene inizializzato, [...], il tipo di ritorno dedotto o tipo di variabile è determinata dal tipo del suo inizializzatore. Se il segnaposto è l'identificatore automatico del tipo, il tipo dedotto viene determinato utilizzando le regole per la deduzione degli argomenti del modello. Se il segnaposto è lo auto
identificatore di tipo, , il tipo dedotto viene determinato utilizzando le regole per la deduzione degli argomenti del modello.
Così, quando abbiamo uno:
auto f = foo<A>;
auto b = bar<A>;
Stiamo eseguendo tipo deduzione come se abbiamo chiamato (per prendere in prestito la scelta di TC di parole):
template <typename M> void meow(M);
meow(foo<A>);
meow(bar<A>);
e utilizzando la dedotta digitare M
come il tipo di f
e b
, rispettivamente.
Ma, secondo [temp.deduct.type], l'enfasi è mia:
Se un parametro di modello viene utilizzato solo nei non-dedotta contesti e non è esplicitamente specificato, la deduzione modello di argomentazione fallisce.
I contesti non dedotta sono:
- [...]
- Un parametro funzione per la quale la deduzione argomento non può essere fatto perché la funzione associata argomento è una funzione o un insieme di funzioni sovraccaricate (13.4), e uno o più dei seguenti casi:
- più di una funzione corrispondente al tipo di parametro di funzione (con un conseguente detrazione ambiguo), o
- nessuna funzione corrisponde al tipo di parametro funzione o
- l'insieme delle funzioni fornite come argomento contiene uno o più modelli di funzione.
- [...]
In entrambi i casi, l'argomento è un insieme di funzioni sovraccaricate che contiene uno o più modelli di funzione - che lo rende un contesto non dedotto, in modo da modello detrazione argomento non. Quindi, clang è corretto nel respingere entrambe le inizializzazioni.
Clang rifiuta entrambi i casi. –
g ++ 4.9.0 sembra accettare il secondo – gd1
@ T.C., G ++ 4.9.2 compila il codice e produce l'output che corrisponde alla descrizione dell'OP. –