2016-03-25 11 views
7

Sono nuovo del C++ e provo solo cose. Ho bloccato con il seguente codice:Violazione della sicurezza del tipo in C++ con dichiarazione di funzione di altro tipo?

#include<iostream> 

void t(){ 
    std::cout << "func t()" << std::endl; 
} 

int main(int argc, char **argv) { 
    int t(); //declaration of function 
    std::cout << t() << std::endl; 
} 

L'uscita è "func t() \ n6295712". La mia preoccupazione è il numero casuale (?) Stampato da t().

La mia domanda è: perché è consentito dichiarare una funzione di un altro tipo di ritorno (qui: int al posto del vuoto) senza errori? Non si tratta di una violazione della sicurezza di tipo perché non ho mai definito una funzione con un tipo di ritorno "int"?

compilatore usate: gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4

+0

Il mio output qui è 'func t() \ n6295680', che è diverso da ** solo **' 6295712'. Il tuo programma stampa davvero solo quel numero? –

+0

Hai ragione, l'ho modificato: ero solo preoccupato del numero e ho dimenticato l'altro output. Grazie –

+0

puoi confermare wtf http://coliru.stacked-crooked.com/a/f9b957636b731736 –

risposta

4

L'unica cosa rilevante che posso trovare è una nota in [basic.scope.pdecl]:

dichiarazioni funzione in blocco scope e dichiarazioni di variabili con lo specificatore extern allo scope block fanno riferimento a dichiarazioni che sono membri di uno spazio dei nomi che racchiude, ma non introducono nuovi nomi in tale scope.

Così, quando si scrive:

void t(); 

int main() { 
    int t(); // * 
} 

Tale dichiarazione interna si riferisce a un membro dello spazio dei nomi che racchiude. Quindi è equivalente ad aver scritto:

void t(); 
int t(); 

int main() {} 

ma le funzioni non possono sovraccaricare solo nel tipo di ritorno, in modo da questo codice è mal-formata. Clang rifiuta entrambi i programmi, gcc rifiuta solo quest'ultimo. Credo che questo sia un bug di gcc.

+1

Grazie per la risposta. Ho inviato un bug report a gcc bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70414. Se questo viene confermato, accetterò la tua risposta. –

+0

's/override/overload /' –

+0

@BarryTheHatchet Woops, grazie – Barry

Problemi correlati