2014-12-15 17 views
28

Ci sono alcuni Stack   Utenti di overflow che sostengono con forza sempre l'uso della nuova convenzione di ritorno di tipo C++ 11 durante la scrittura di funzioni, come ad esempio main()->int. Vedo dei vantaggi, in quanto rende uniforme la notazione. Tuttavia, quando si dichiara un puntatore a funzione, non riesco a trovare alcun modo di utilizzare una forma di ritorno finale, ossia può dichiarare oUtilizzo di un puntatore a funzione con un tipo di ritorno finale

typedef int(*fp)(int);

o

using fp = int(*)(int);

per un puntatore funzione prendendo un int e restituendo un int.

Esiste un modo per utilizzare la nuova sintassi di ritorno finale nel dichiarare un puntatore a funzione simile? Ad esempio, qualcosa come

using fp = (*)(int)->int;

ma questo non può essere compilato. In caso contrario, c'è una ragione per cui la nuova sintassi non è applicabile ai puntatori di funzione?

risposta

25

devi usare auto

using fp = auto (*)(int) -> int; 
typedef auto (*fp)(int) -> int; // alternatively 

Trailing tipo di ritorno sintassi significa mettere il auto prima che il nome della funzione per indicare che il tipo restituito segue (o, nel caso di C++ 14, dovrebbe essere dedotta). Per i puntatori di funzione vale la stessa regola, tranne per il fatto che non può dedurlo (per ovvi motivi).

Questo è vero per le funzioni come bene però, il vostro esempio

main() -> int {... } 

non è valida se manca il precedente auto

+0

Grazie, per qualche motivo, ho dimenticato la necessità di 'auto' nelle funzioni di tipo ritorno finale. Ha senso. – vsoftco

+0

Appena capito :) Grazie mille, accetterà la tua risposta come era 5 secondi più veloce :) – vsoftco

13

volete uno di questi a seconda se si sta utilizzando using dichiarazione o un typedef :

using fp = auto (*)(int)->int; 
typedef auto (*gp)(int) -> int; 
+0

Grazie, per qualche motivo mi sono dimenticato della necessità di 'auto'. – vsoftco

Problemi correlati