2013-11-29 19 views
5

consideri this articolo di MSDN ('argomenti di default') e il seguente codice:C: MSDN dice che "gli argomenti predefiniti possono essere forniti per i puntatori alle funzioni", ma è vero?

#include <stdio.h> 

void print(int x) { 
    printf("%d\n", x + 537); 
} 

typedef void (*Func)(int x = 0); 

int main() { 
    Func f = print; 
    f(); 
    return 0; 
} 

L'articolo afferma che "argomenti predefinite possono essere ovided per puntatori a funzioni. Per esempio: int (*pShowIntVal)(int i = 0);". Come ho capito, significa che il codice sopra dovrebbe compilare con successo. Tuttavia, non è così:

a.cpp 
a.cpp(7) : error C2383: 'Func' : default-arguments are not allowed on this symbol 
a.cpp(11) : error C2198: 'Func' : too few arguments for call 

Sembra che abbia frainteso l'articolo. Qual è il punto, qual è l'interpretazione corretta?

+0

non posso nemmeno dire semplicemente 'int (* pShowIntVal) (int i = 0); 'nel codice! "errore 2383: 'pShowIntVal': gli argomenti predefiniti non sono consentiti su questo simbolo" –

risposta

2

L'argomento predefinito è parte di una funzione dichiarazione ma non è parte della sua tipo. Così si può scrivere:

void f(int x = 0); 

ma il tipo di F è ancora

void(int x) 

E di conseguenza, un puntatore a funzione di tipo non può includere argomenti di default.

(Riferimento: § 8.3.6/9 [dcl.fct.default]: "Un argomento di default non è parte del tipo di una funzione")

+1

Quindi il codice Microsoft non ha senso, in realtà è un codice C++ non valido. –

+0

@EarthEngine sembra essere il caso –

+0

@EarthEngine: corretto. Una volta gcc accettava gli argomenti predefiniti in puntatori e typedef, ma era stato ritirato una decina di anni fa. Non so su VC++. – rici