si sta passando un tipo-id, che è definito in [dcl.name] come
[...] sintatticamente una dichiarazione di una variabile o una funzione di quel tipo che omette il nome dell'entità. [...] È possibile identificare in modo univoco la posizione nel dichiaratore astratto in cui l'identificatore apparirebbe se la costruzione fosse un dichiarante in una dichiarazione. Il tipo named è quindi uguale al tipo dell'identificatore ipotetico .
Per l'identificatore ipotetico di avere un qualche tipo, la dichiarazione ipotetica deve essere ben formata in primo luogo. Ma non è come per [dcl.fct]/10. Quindi il programma è mal formato (e i messaggi di errore dei compilatori sono effettivamente comprensibili). Questo caso è anche più direttamente coperto da [temp.deduct]/(8.10), il che implica che si tratta di un errore (SFINAE-friendly).
Infatti, solo l'utilizzo di un tipo non valido è sufficiente per rendere il programma mal formato. Per esempio. la creazione del tipo puntatore a funzione funzione che restituisce è mal formato:
using f = int();
using t = f(*)();
Così è la seguente:
struct A {virtual void f() = 0;};
using t = A(*)();
(Clang non deve essere l'accettazione del presente Cf GCC bug 17232 E' interessante discussione.) .
Penso che questo "L'errore su entrambi i compilatori riguarda l'illegittimità di dichiarare una funzione che restituisce una funzione". sarebbe utilmente sostituito dall'errore effettivo – Guiroux
Perché non usi semplicemente 'decltype (foo())'? – StenSoft
Non è consentito creare un tipo di funzione in cui la funzione restituisce un altro tipo di funzione. "Le funzioni non devono avere un tipo di ritorno di tipo matrice o funzione" dcl.fct/8 – Simple