2016-03-25 12 views
7

Ich bin neu in C++ und probiere einfach Sachen aus. Ich steckte mit dem folgenden Code:Verletzung der Typsicherheit in C++ bei Funktionsdeklaration anderer Art?

#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; 
} 

Der Ausgang ist "func t() \ n6295712". Mein Anliegen ist die zufällige (?) Nummer, die mit t() gedruckt wird.

Meine Frage ist: Warum ist es erlaubt, eine Funktion eines anderen Rückgabetyps (hier: int statt void) ohne Fehler zu deklarieren? Ist das keine Verletzung der Typsicherheit, weil ich nie eine Funktion mit dem Rückgabetyp "int" definiert habe?

Gebrauchte Compiler: gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4

+0

Meine Ausgabe hier ist 'func t() \ n6295680', die sich von ** nur **' 6295712' unterscheidet. Druckt Ihr Programm wirklich nur diese Nummer? –

+0

Sie haben Recht, ich habe es bearbeitet - ich war nur mit der Nummer beschäftigt und vergaß die andere Ausgabe. Danke –

+0

kann bestätigen wtf http://coliru.stacked-crooked.com/a/f9b957636b731736 –

Antwort

4

Die einzige relevante, was ich eine Notiz in [basic.scope.pdecl] finden:

Funktionsdeklarationen bei Block Bereichs- und Variablendeklarationen mit dem externen Spezifizierer bei Blockbereich beziehen sich auf Deklarationen, die Mitglieder eines umschließenden Namespace sind, aber sie führen keine neuen Namen in diesen Bereich ein. So

, wenn Sie schreiben:

void t(); 

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

Das innere Erklärung bezieht sich auf ein Mitglied des einschließenden Namespace. Also ist es gleichbedeutend mit geschrieben haben:

Aber Funktionen können nicht nur im Rückgabetyp überladen, so dass dieser Code schlecht ausgebildet ist. Clang lehnt beide Programme ab, gcc lehnt nur letztere ab. Ich glaube, das ist ein gcc-Fehler.

+1

Vielen Dank für Ihre Antwort. Ich habe einen Fehlerbericht an gcc bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70414 gesendet. Wenn dies bestätigt wird, werde ich Ihre Antwort akzeptieren. –

+0

's/override/overload /' –

+0

@BarryTheHatchet Woops, danke – Barry